[PATCH] Add --no-reuse-delta, --window, and --depth options to git-gc
From: "Theodore Ts'o" <tytso@mit.edu>
Date: 2016-06-15 22:43:08
Subsystem:
documentation, the rest · Maintainers:
Jonathan Corbet, Linus Torvalds
Sometimes users might want to use more aggressive packing options when doing a git-gc. This allows them to do so without having to use the low-level plumbing commands. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> --- Documentation/git-gc.txt | 3 ++- Documentation/git-pack-objects.txt | 19 +------------------ Documentation/pack-options.txt | 18 ++++++++++++++++++ builtin-gc.c | 30 ++++++++++++++++++++++++++++-- 4 files changed, 49 insertions(+), 21 deletions(-) create mode 100644 Documentation/pack-options.txt
diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt
index bc16584..3c807c2 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] [--window=N] [--depth=N] DESCRIPTION -----------
@@ -35,6 +35,7 @@ OPTIONS repository at the same time (e.g. never use this option in a cron script). +include::pack-options.txt[] Configuration -------------
diff --git a/Documentation/git-pack-objects.txt b/Documentation/git-pack-objects.txt
index d9e11c6..aac71f6 100644
--- a/Documentation/git-pack-objects.txt
+++ b/Documentation/git-pack-objects.txt@@ -73,18 +73,6 @@ base-name:: as if all refs under `$GIT_DIR/refs` are specified to be included. ---window=[N], --depth=[N]:: - These two options affect how the objects contained in - the pack are stored using delta compression. The - objects are first internally sorted by type, size and - optionally names and compared against the other objects - within --window to see if using delta compression saves - space. --depth limits the maximum delta depth; making - it too deep affects the performance on the unpacker - side, because delta data needs to be applied that many - times to get to the necessary object. - The default value for both --window and --depth is 10. - --incremental:: This flag causes an object already in a pack ignored even if it appears in the standard input.
@@ -120,12 +108,7 @@ base-name:: This flag makes the command not to report its progress on the standard error stream. ---no-reuse-delta:: - When creating a packed archive in a repository that - has existing packs, the command reuses existing deltas. - This sometimes results in a slightly suboptimal pack. - This flag tells the command not to reuse existing deltas - but compute them from scratch. +include::pack-options.txt[] --delta-base-offset:: A packed archive can express base object of a delta as
diff --git a/Documentation/pack-options.txt b/Documentation/pack-options.txt
new file mode 100644
index 0000000..7b0ae5f
--- /dev/null
+++ b/Documentation/pack-options.txt@@ -0,0 +1,18 @@ +--window=[N], --depth=[N]:: + These two options affect how the objects contained in + the pack are stored using delta compression. The + objects are first internally sorted by type, size and + optionally names and compared against the other objects + within --window to see if using delta compression saves + space. --depth limits the maximum delta depth; making + it too deep affects the performance on the unpacker + side, because delta data needs to be applied that many + times to get to the necessary object. + The default value for both --window and --depth is 10. + +--no-reuse-delta:: + When creating a packed archive in a repository that + has existing packs, the command reuses existing deltas. + This sometimes results in a slightly suboptimal pack. + This flag tells the command not to reuse existing deltas + but compute them from scratch.
diff --git a/builtin-gc.c b/builtin-gc.c
index 3b1f8c2..7e7775d 100644
--- a/builtin-gc.c
+++ b/builtin-gc.c@@ -15,13 +15,15 @@ #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] [--window=N] [--depth=N]"; 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 +39,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 +70,15 @@ 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; + } + if (!strncmp(arg, "--window", 8) || + !strncmp(arg, "--depth", 7)) { + append_option(argv_repack, arg, MAX_ADD); + continue; + } /* perhaps other parameters later... */ break; }
--
1.5.2.rc1.20.g86b9-dirty