From 630876f9e4910a4c91705c6cc98414123547419a Mon Sep 17 00:00:00 2001 From: XD Trol Date: Mon, 17 Jan 2022 23:29:04 +0800 Subject: [PATCH] init: add an option --enable-git-lfs-filter It was reported that git-lfs did not work with git-repo. Specifically, `git read-tree -u` run by `repo sync` would fail git-lfs's smudge filter. See https://github.com/github/git-lfs/issues/1422. In fact, by the time `git read-tree -u` is run, the repository is not bare. It is just that, the working directory is not the same as the .git directory. git-lfs's filter should work. No one seems to have delved into that issue. Today, with newer versions of git-repo and git-lfs, that issue will not reproduce. Tested with - git 2.33, git-lfs 2.13 on macOS - git 2.17, git-lfs 2.3 on ubuntu So, it seems fine to add an option --enable-git-lfs-filter, default to false, and stat that it may not work with older versions of git and git-lfs in the help doc. Bug: https://crbug.com/gerrit/14516 Change-Id: I8d21854eeeea541e072f63d6b10ad1253b1a9826 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/328359 Tested-by: XD Trol Reviewed-by: Mike Frysinger --- docs/internal-fs-layout.md | 2 ++ manifest_xml.py | 4 ++++ project.py | 5 +++-- repo | 7 ++++++- subcmds/init.py | 9 +++++++++ 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/docs/internal-fs-layout.md b/docs/internal-fs-layout.md index af6a4523..0e830510 100644 --- a/docs/internal-fs-layout.md +++ b/docs/internal-fs-layout.md @@ -163,6 +163,7 @@ User controlled settings are initialized when running `repo init`. | repo.clonefilter | `--clone-filter` | Filter setting when using [partial git clones] | | repo.depth | `--depth` | Create shallow checkouts when cloning | | repo.dissociate | `--dissociate` | Dissociate from any reference/mirrors after initial clone | +| repo.git-lfs | `--git-lfs` | Enable [Git LFS] support | | repo.mirror | `--mirror` | Checkout is a repo mirror | | repo.partialclone | `--partial-clone` | Create [partial git clones] | | repo.partialcloneexclude | `--partial-clone-exclude` | Comma-delimited list of project names (not paths) to exclude while using [partial git clones] | @@ -254,6 +255,7 @@ Repo will create & maintain a few files in the user's home directory. [git-config]: https://git-scm.com/docs/git-config +[Git LFS]: https://git-lfs.github.com/ [git worktree]: https://git-scm.com/docs/git-worktree [gitsubmodules]: https://git-scm.com/docs/gitsubmodules [manifest-format.md]: ./manifest-format.md diff --git a/manifest_xml.py b/manifest_xml.py index 68ead53c..daf85d30 100644 --- a/manifest_xml.py +++ b/manifest_xml.py @@ -666,6 +666,10 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md def HasSubmodules(self): return self.manifestProject.config.GetBoolean('repo.submodules') + @property + def EnableGitLfs(self): + return self.manifestProject.config.GetBoolean('repo.git-lfs') + def GetDefaultGroupsStr(self): """Returns the default group string for the platform.""" return 'default,platform-' + platform.system().lower() diff --git a/project.py b/project.py index 8490d9f9..12257857 100644 --- a/project.py +++ b/project.py @@ -2533,8 +2533,9 @@ class Project(object): for key in ['user.name', 'user.email']: if m.Has(key, include_defaults=False): self.config.SetString(key, m.GetString(key)) - self.config.SetString('filter.lfs.smudge', 'git-lfs smudge --skip -- %f') - self.config.SetString('filter.lfs.process', 'git-lfs filter-process --skip') + if not self.manifest.EnableGitLfs: + self.config.SetString('filter.lfs.smudge', 'git-lfs smudge --skip -- %f') + self.config.SetString('filter.lfs.process', 'git-lfs filter-process --skip') self.config.SetBoolean('core.bare', True if self.manifest.IsMirror else None) except Exception: if init_obj_dir and os.path.exists(self.objdir): diff --git a/repo b/repo index 6d7ce42a..c084b654 100755 --- a/repo +++ b/repo @@ -149,7 +149,7 @@ if not REPO_REV: BUG_URL = 'https://bugs.chromium.org/p/gerrit/issues/entry?template=Repo+tool+issue' # increment this whenever we make important changes to this script -VERSION = (2, 17) +VERSION = (2, 21) # increment this if the MAINTAINER_KEYS block is modified KEYRING_VERSION = (2, 3) @@ -382,6 +382,11 @@ def InitParser(parser, gitc_init=False): group.add_option('--no-clone-bundle', dest='clone_bundle', action='store_false', help='disable use of /clone.bundle on HTTP/HTTPS (default if --partial-clone)') + group.add_option('--git-lfs', action='store_true', + help='enable Git LFS support') + group.add_option('--no-git-lfs', + dest='git_lfs', action='store_false', + help='disable Git LFS support') # Tool. group = parser.add_option_group('repo Version options') diff --git a/subcmds/init.py b/subcmds/init.py index b0db76a4..32c85f79 100644 --- a/subcmds/init.py +++ b/subcmds/init.py @@ -291,6 +291,15 @@ to update the working directory files. if opt.submodules: m.config.SetBoolean('repo.submodules', opt.submodules) + if opt.git_lfs is not None: + if opt.git_lfs: + git_require((2, 17, 0), fail=True, msg='Git LFS support') + + m.config.SetBoolean('repo.git-lfs', opt.git_lfs) + if not is_new: + print('warning: Changing --git-lfs settings will only affect new project checkouts.\n' + ' Existing projects will require manual updates.\n', file=sys.stderr) + if opt.use_superproject is not None: m.config.SetBoolean('repo.superproject', opt.use_superproject)