summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Frysinger <vapier@google.com>2020-02-11 03:23:24 -0500
committerMike Frysinger <vapier@google.com>2020-02-11 23:58:43 +0000
commit5f2b04519596f285cc70717c95231ce85666e382 (patch)
tree0adf06ab67824998f080f527cfdd6423324efe05
parent163d42eb43ba79677aae22fa859896010badba9b (diff)
downloadgit-repo-5f2b04519596f285cc70717c95231ce85666e382.tar.gz
sync: change how we preserve objects in shared repos
Some automatic git operations will prune objects on us, and not just the gc step. Normally we don't care, but with shared projects, we will have multiple git checkouts with refs that the others cannot see, but with a shared object dir. Any pruning of objects based on refs in just one repo can easily break the others. git-2.7.0 introduced a preciousObjects setting which tells git to never prune objects for this exact scenario: there might be refs in some location that git is unable to see. Change-Id: I781de27c5bbe1d4c70f0187566141c9cce088bd8 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/254392 Reviewed-by: Nasser Grainawi <nasser@codeaurora.org> Reviewed-by: David Riley <davidriley@google.com> Reviewed-by: Mike Frysinger <vapier@google.com> Tested-by: Mike Frysinger <vapier@google.com>
-rw-r--r--subcmds/sync.py15
1 files changed, 13 insertions, 2 deletions
diff --git a/subcmds/sync.py b/subcmds/sync.py
index 808df208..f41de8df 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -560,9 +560,20 @@ later is required to fix a server side protocol bug.
560 def _GCProjects(self, projects, opt, err_event): 560 def _GCProjects(self, projects, opt, err_event):
561 gc_gitdirs = {} 561 gc_gitdirs = {}
562 for project in projects: 562 for project in projects:
563 # Make sure pruning never kicks in with shared projects.
563 if len(project.manifest.GetProjectsWithName(project.name)) > 1: 564 if len(project.manifest.GetProjectsWithName(project.name)) > 1:
564 print('Shared project %s found, disabling pruning.' % project.name) 565 print('%s: Shared project %s found, disabling pruning.' %
565 project.bare_git.config('--replace-all', 'gc.pruneExpire', 'never') 566 (project.relpath, project.name))
567 if git_require((2, 7, 0)):
568 project.config.SetString('core.repositoryFormatVersion', '1')
569 project.config.SetString('extensions.preciousObjects', 'true')
570 else:
571 # This isn't perfect, but it's the best we can do with old git.
572 print('%s: WARNING: shared projects are unreliable when using old '
573 'versions of git; please upgrade to git-2.7.0+.'
574 % (project.relpath,),
575 file=sys.stderr)
576 project.config.SetString('gc.pruneExpire', 'never')
566 gc_gitdirs[project.gitdir] = project.bare_git 577 gc_gitdirs[project.gitdir] = project.bare_git
567 578
568 has_dash_c = git_require((1, 7, 2)) 579 has_dash_c = git_require((1, 7, 2))