This allows the user to regenerate the deltas in packs while doing a git-gc. The user could just run git-repack -a -d -f -l after running git-gc, but then the first git-repack run by git-gc is a bit of waste. Signed-off-by: "Theodore Ts'o" <tytso@xxxxxxx> --- Documentation/git-gc.txt | 7 ++++++- builtin-gc.c | 24 ++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt index bc16584..0493d06 100644 --- a/Documentation/git-gc.txt +++ b/Documentation/git-gc.txt @@ -8,7 +8,7 @@ git-gc - Cleanup unnecessary files and optimize the local repository SYNOPSIS -------- -'git-gc' [--prune] +'git-gc' [--prune] [--no-reuse-delta] DESCRIPTION ----------- @@ -35,6 +35,11 @@ OPTIONS repository at the same time (e.g. never use this option in a cron script). +--no-reuse-delta:: + This causes deltas in existing packs to be recalculated instead + of reusing the existing deltas. This can save disk space at + the cost of taking more time to recalculate them from scratch. + Configuration ------------- diff --git a/builtin-gc.c b/builtin-gc.c index 3b1f8c2..5cb7ffd 100644 --- a/builtin-gc.c +++ b/builtin-gc.c @@ -15,13 +15,14 @@ #define FAILED_RUN "failed to run %s" -static const char builtin_gc_usage[] = "git-gc [--prune]"; +static const char builtin_gc_usage[] = "git-gc [--prune] [--no-reuse-delta]"; static int pack_refs = -1; +#define MAX_ADD 10 static const char *argv_pack_refs[] = {"pack-refs", "--prune", NULL}; static const char *argv_reflog[] = {"reflog", "expire", "--all", NULL}; -static const char *argv_repack[] = {"repack", "-a", "-d", "-l", NULL}; +static const char *argv_repack[MAX_ADD] = {"repack", "-a", "-d", "-l", NULL}; static const char *argv_prune[] = {"prune", NULL}; static const char *argv_rerere[] = {"rerere", "gc", NULL}; @@ -37,6 +38,21 @@ static int gc_config(const char *var, const char *value) return git_default_config(var, value); } +static append_option(const char **cmd, const char *opt, int max_length) +{ + int i; + + for (i=0; cmd[i]; i++) + ; + + if (i+2 >= max_length) { + fprintf(stderr, "Too many options specified\n"); + exit(1); + } + cmd[i++] = opt; + cmd[i] = 0; +} + int cmd_gc(int argc, const char **argv, const char *prefix) { int i; @@ -53,6 +69,10 @@ int cmd_gc(int argc, const char **argv, const char *prefix) prune = 1; continue; } + if (!strcmp(arg, "--no-reuse-delta")) { + append_option(argv_repack, "-f", MAX_ADD); + continue; + } /* perhaps other parameters later... */ break; } -- 1.5.2.rc2.22.ga39d - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html