Skip to content

Commit 125f814

Browse files
pcloudsgitster
authored andcommitted
gc --aggressive: make --depth configurable
When 1c192f3 (gc --aggressive: make it really aggressive - 2007-12-06) made --depth=250 the default value, it didn't really explain the reason behind, especially the pros and cons of --depth=250. An old mail from Linus below explains it at length. Long story short, --depth=250 is a disk saver and a performance killer. Not everybody agrees on that aggressiveness. Let the user configure it. From: Linus Torvalds <[email protected]> Subject: Re: [PATCH] gc --aggressive: make it really aggressive Date: Thu, 6 Dec 2007 08:19:24 -0800 (PST) Message-ID: <[email protected]> Gmane-URL: http://article.gmane.org/gmane.comp.gcc.devel/94637 On Thu, 6 Dec 2007, Harvey Harrison wrote: > > 7:41:25elapsed 86%CPU Heh. And this is why you want to do it exactly *once*, and then just export the end result for others ;) > -r--r--r-- 1 hharrison hharrison 324094684 2007-12-06 07:26 pack-1d46...pack But yeah, especially if you allow longer delta chains, the end result can be much smaller (and what makes the one-time repack more expensive is the window size, not the delta chain - you could make the delta chains longer with no cost overhead at packing time) HOWEVER. The longer delta chains do make it potentially much more expensive to then use old history. So there's a trade-off. And quite frankly, a delta depth of 250 is likely going to cause overflows in the delta cache (which is only 256 entries in size *and* it's a hash, so it's going to start having hash conflicts long before hitting the 250 depth limit). So when I said "--depth=250 --window=250", I chose those numbers more as an example of extremely aggressive packing, and I'm not at all sure that the end result is necessarily wonderfully usable. It's going to save disk space (and network bandwidth - the delta's will be re-used for the network protocol too!), but there are definitely downsides too, and using long delta chains may simply not be worth it in practice. (And some of it might just want to have git tuning, ie if people think that long deltas are worth it, we could easily just expand on the delta hash, at the cost of some more memory used!) That said, the good news is that working with *new* history will not be affected negatively, and if you want to be _really_ sneaky, there are ways to say "create a pack that contains the history up to a version one year ago, and be very aggressive about those old versions that we still want to have around, but do a separate pack for newer stuff using less aggressive parameters" So this is something that can be tweaked, although we don't really have any really nice interfaces for stuff like that (ie the git delta cache size is hardcoded in the sources and cannot be set in the config file, and the "pack old history more aggressively" involves some manual scripting and knowing how "git pack-objects" works rather than any nice simple command line switch). So the thing to take away from this is: - git is certainly flexible as hell - .. but to get the full power you may need to tweak things - .. happily you really only need to have one person to do the tweaking, and the tweaked end results will be available to others that do not need to know/care. And whether the difference between 320MB and 500MB is worth any really involved tweaking (considering the potential downsides), I really don't know. Only testing will tell. Linus Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 00eda23 commit 125f814

File tree

3 files changed

+15
-1
lines changed

3 files changed

+15
-1
lines changed

Documentation/config.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,11 @@ filter.<driver>.smudge::
11511151
object to a worktree file upon checkout. See
11521152
linkgit:gitattributes[5] for details.
11531153

1154+
gc.aggressiveDepth::
1155+
The depth parameter used in the delta compression
1156+
algorithm used by 'git gc --aggressive'. This defaults
1157+
to 250.
1158+
11541159
gc.aggressiveWindow::
11551160
The window size parameter used in the delta compression
11561161
algorithm used by 'git gc --aggressive'. This defaults

Documentation/git-gc.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ the value, the more time is spent optimizing the delta compression. See
124124
the documentation for the --window' option in linkgit:git-repack[1] for
125125
more details. This defaults to 250.
126126

127+
Similarly, the optional configuration variable 'gc.aggressiveDepth'
128+
controls --depth option in linkgit:git-repack[1]. This defaults to 250.
129+
127130
The optional configuration variable 'gc.pruneExpire' controls how old
128131
the unreferenced loose objects have to be before they are pruned. The
129132
default is "2 weeks ago".

builtin/gc.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ static const char * const builtin_gc_usage[] = {
2626
};
2727

2828
static int pack_refs = 1;
29+
static int aggressive_depth = 250;
2930
static int aggressive_window = 250;
3031
static int gc_auto_threshold = 6700;
3132
static int gc_auto_pack_limit = 50;
@@ -66,6 +67,10 @@ static int gc_config(const char *var, const char *value, void *cb)
6667
aggressive_window = git_config_int(var, value);
6768
return 0;
6869
}
70+
if (!strcmp(var, "gc.aggressivedepth")) {
71+
aggressive_depth = git_config_int(var, value);
72+
return 0;
73+
}
6974
if (!strcmp(var, "gc.auto")) {
7075
gc_auto_threshold = git_config_int(var, value);
7176
return 0;
@@ -294,7 +299,8 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
294299

295300
if (aggressive) {
296301
argv_array_push(&repack, "-f");
297-
argv_array_push(&repack, "--depth=250");
302+
if (aggressive_depth > 0)
303+
argv_array_pushf(&repack, "--depth=%d", aggressive_depth);
298304
if (aggressive_window > 0)
299305
argv_array_pushf(&repack, "--window=%d", aggressive_window);
300306
}

0 commit comments

Comments
 (0)