sync: no garbage collection by default
Adds --auto-gc and --no-auto-gc (default) options to control sync's
behavior around calling `git gc`.
Bug: b/184882274
Change-Id: I4d6ca3b233d79566f27e876ab2d79f238ebc12a9
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/344535
Reviewed-by: Xin Li <delphij@google.com>
Tested-by: LaMont Jones <lamontjones@google.com>
diff --git a/man/repo-smartsync.1 b/man/repo-smartsync.1
index 8475adf..c1abbb3 100644
--- a/man/repo-smartsync.1
+++ b/man/repo-smartsync.1
@@ -1,5 +1,5 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man.
-.TH REPO "1" "August 2022" "repo smartsync" "Repo Manual"
+.TH REPO "1" "November 2022" "repo smartsync" "Repo Manual"
.SH NAME
repo \- repo smartsync - manual page for repo smartsync
.SH SYNOPSIS
@@ -105,6 +105,13 @@
.TP
\fB\-\-no\-prune\fR
do not delete refs that no longer exist on the remote
+.TP
+\fB\-\-auto\-gc\fR
+run garbage collection on all synced projects
+.TP
+\fB\-\-no\-auto\-gc\fR
+do not run garbage collection on any projects
+(default)
.SS Logging options:
.TP
\fB\-v\fR, \fB\-\-verbose\fR
diff --git a/man/repo-sync.1 b/man/repo-sync.1
index 9cc528d..f006c03 100644
--- a/man/repo-sync.1
+++ b/man/repo-sync.1
@@ -1,5 +1,5 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man.
-.TH REPO "1" "August 2022" "repo sync" "Repo Manual"
+.TH REPO "1" "November 2022" "repo sync" "Repo Manual"
.SH NAME
repo \- repo sync - manual page for repo sync
.SH SYNOPSIS
@@ -106,6 +106,13 @@
\fB\-\-no\-prune\fR
do not delete refs that no longer exist on the remote
.TP
+\fB\-\-auto\-gc\fR
+run garbage collection on all synced projects
+.TP
+\fB\-\-no\-auto\-gc\fR
+do not run garbage collection on any projects
+(default)
+.TP
\fB\-s\fR, \fB\-\-smart\-sync\fR
smart sync using manifest from the latest known good
build
@@ -200,6 +207,9 @@
The \fB\-\-prune\fR option can be used to remove any refs that no longer exist on the
remote.
.PP
+The \fB\-\-auto\-gc\fR option can be used to trigger garbage collection on all projects.
+By default, repo does not run garbage collection.
+.PP
SSH Connections
.PP
If at least one project remote URL uses an SSH connection (ssh://, git+ssh://,
diff --git a/man/repo.1 b/man/repo.1
index bdb705d..e7368a8 100644
--- a/man/repo.1
+++ b/man/repo.1
@@ -1,5 +1,5 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man.
-.TH REPO "1" "July 2022" "repo" "Repo Manual"
+.TH REPO "1" "November 2022" "repo" "Repo Manual"
.SH NAME
repo \- repository management tool built on top of git
.SH SYNOPSIS
@@ -25,6 +25,10 @@
\fB\-\-trace\fR
trace git command execution (REPO_TRACE=1)
.TP
+\fB\-\-trace_to_stderr\fR
+trace outputs go to stderr in addition to
+\&.repo/TRACE_FILE
+.TP
\fB\-\-trace\-python\fR
trace python command execution
.TP
diff --git a/subcmds/sync.py b/subcmds/sync.py
index 83c9ad3..b7542cc 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -200,6 +200,9 @@
The --prune option can be used to remove any refs that no longer
exist on the remote.
+The --auto-gc option can be used to trigger garbage collection on all
+projects. By default, repo does not run garbage collection.
+
# SSH Connections
If at least one project remote URL uses an SSH connection (ssh://,
@@ -309,6 +312,10 @@
help='delete refs that no longer exist on the remote (default)')
p.add_option('--no-prune', dest='prune', action='store_false',
help='do not delete refs that no longer exist on the remote')
+ p.add_option('--auto-gc', action='store_true',
+ help='run garbage collection on all synced projects')
+ p.add_option('--no-auto-gc', dest='auto_gc', action='store_false',
+ help='do not run garbage collection on any projects (default)')
if show_smart:
p.add_option('-s', '--smart-sync',
dest='smart_sync', action='store_true',
@@ -829,7 +836,14 @@
project.config.SetString('gc.pruneExpire', None)
def _GCProjects(self, projects, opt, err_event):
- pm = Progress('Garbage collecting', len(projects), delay=False, quiet=opt.quiet)
+ """Perform garbage collection.
+
+ If We are skipping garbage collection (opt.auto_gc not set), we still want
+ to potentially mark objects precious, so that `git gc` does not discard
+ shared objects.
+ """
+ pm = Progress(f'{"" if opt.auto_gc else "NOT "}Garbage collecting',
+ len(projects), delay=False, quiet=opt.quiet)
pm.update(inc=0, msg='prescan')
tidy_dirs = {}
@@ -849,6 +863,10 @@
project.bare_git,
)
+ if not opt.auto_gc:
+ pm.end()
+ return
+
jobs = opt.jobs
gc_args = ['--auto']