gc: make --prune useful again by accepting an optional parameter
With this patch, "git gc --no-prune" will not prune any loose (and dangling) object, and "git gc --prune=5.minutes.ago" will prune all loose objects older than 5 minutes. This patch benefitted from suggestions by Thomas Rast and Jan Krï¿œger. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e9cc02f0e4
commit
58e9d9d472
@ -8,7 +8,7 @@ git-gc - Cleanup unnecessary files and optimize the local repository
|
|||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
'git gc' [--aggressive] [--auto] [--quiet]
|
'git gc' [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune]
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
@ -59,6 +59,14 @@ are consolidated into a single pack by using the `-A` option of
|
|||||||
'git-repack'. Setting `gc.autopacklimit` to 0 disables
|
'git-repack'. Setting `gc.autopacklimit` to 0 disables
|
||||||
automatic consolidation of packs.
|
automatic consolidation of packs.
|
||||||
|
|
||||||
|
--prune=<date>::
|
||||||
|
Prune loose objects older than date (default is 2 weeks ago,
|
||||||
|
overrideable by the config variable `gc.pruneExpire`). This
|
||||||
|
option is on by default.
|
||||||
|
|
||||||
|
--no-prune::
|
||||||
|
Do not prune any loose objects.
|
||||||
|
|
||||||
--quiet::
|
--quiet::
|
||||||
Suppress all progress reports.
|
Suppress all progress reports.
|
||||||
|
|
||||||
|
19
builtin-gc.c
19
builtin-gc.c
@ -161,7 +161,8 @@ static int need_to_gc(void)
|
|||||||
*/
|
*/
|
||||||
if (too_many_packs())
|
if (too_many_packs())
|
||||||
append_option(argv_repack,
|
append_option(argv_repack,
|
||||||
!strcmp(prune_expire, "now") ? "-a" : "-A",
|
prune_expire && !strcmp(prune_expire, "now") ?
|
||||||
|
"-a" : "-A",
|
||||||
MAX_ADD);
|
MAX_ADD);
|
||||||
else if (!too_many_loose_objects())
|
else if (!too_many_loose_objects())
|
||||||
return 0;
|
return 0;
|
||||||
@ -173,14 +174,15 @@ static int need_to_gc(void)
|
|||||||
|
|
||||||
int cmd_gc(int argc, const char **argv, const char *prefix)
|
int cmd_gc(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
int prune = 0;
|
|
||||||
int aggressive = 0;
|
int aggressive = 0;
|
||||||
int auto_gc = 0;
|
int auto_gc = 0;
|
||||||
int quiet = 0;
|
int quiet = 0;
|
||||||
char buf[80];
|
char buf[80];
|
||||||
|
|
||||||
struct option builtin_gc_options[] = {
|
struct option builtin_gc_options[] = {
|
||||||
OPT_BOOLEAN(0, "prune", &prune, "prune unreferenced objects (deprecated)"),
|
{ OPTION_STRING, 0, "prune", &prune_expire, "date",
|
||||||
|
"prune unreferenced objects",
|
||||||
|
PARSE_OPT_OPTARG, NULL, (intptr_t)prune_expire },
|
||||||
OPT_BOOLEAN(0, "aggressive", &aggressive, "be more thorough (increased runtime)"),
|
OPT_BOOLEAN(0, "aggressive", &aggressive, "be more thorough (increased runtime)"),
|
||||||
OPT_BOOLEAN(0, "auto", &auto_gc, "enable auto-gc mode"),
|
OPT_BOOLEAN(0, "auto", &auto_gc, "enable auto-gc mode"),
|
||||||
OPT_BOOLEAN('q', "quiet", &quiet, "suppress progress reports"),
|
OPT_BOOLEAN('q', "quiet", &quiet, "suppress progress reports"),
|
||||||
@ -218,7 +220,8 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
|
|||||||
"\"git help gc\" for more information.\n");
|
"\"git help gc\" for more information.\n");
|
||||||
} else
|
} else
|
||||||
append_option(argv_repack,
|
append_option(argv_repack,
|
||||||
!strcmp(prune_expire, "now") ? "-a" : "-A",
|
prune_expire && !strcmp(prune_expire, "now")
|
||||||
|
? "-a" : "-A",
|
||||||
MAX_ADD);
|
MAX_ADD);
|
||||||
|
|
||||||
if (pack_refs && run_command_v_opt(argv_pack_refs, RUN_GIT_CMD))
|
if (pack_refs && run_command_v_opt(argv_pack_refs, RUN_GIT_CMD))
|
||||||
@ -230,9 +233,11 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
|
|||||||
if (run_command_v_opt(argv_repack, RUN_GIT_CMD))
|
if (run_command_v_opt(argv_repack, RUN_GIT_CMD))
|
||||||
return error(FAILED_RUN, argv_repack[0]);
|
return error(FAILED_RUN, argv_repack[0]);
|
||||||
|
|
||||||
argv_prune[2] = prune_expire;
|
if (prune_expire) {
|
||||||
if (run_command_v_opt(argv_prune, RUN_GIT_CMD))
|
argv_prune[2] = prune_expire;
|
||||||
return error(FAILED_RUN, argv_prune[0]);
|
if (run_command_v_opt(argv_prune, RUN_GIT_CMD))
|
||||||
|
return error(FAILED_RUN, argv_prune[0]);
|
||||||
|
}
|
||||||
|
|
||||||
if (run_command_v_opt(argv_rerere, RUN_GIT_CMD))
|
if (run_command_v_opt(argv_rerere, RUN_GIT_CMD))
|
||||||
return error(FAILED_RUN, argv_rerere[0]);
|
return error(FAILED_RUN, argv_rerere[0]);
|
||||||
|
@ -112,4 +112,42 @@ test_expect_success 'prune: do not prune heads listed as an argument' '
|
|||||||
|
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'gc --no-prune' '
|
||||||
|
|
||||||
|
before=$(git count-objects | sed "s/ .*//") &&
|
||||||
|
BLOB=$(echo aleph_0 | git hash-object -w --stdin) &&
|
||||||
|
BLOB_FILE=.git/objects/$(echo $BLOB | sed "s/^../&\//") &&
|
||||||
|
test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
|
||||||
|
test -f $BLOB_FILE &&
|
||||||
|
test-chmtime =-$((86400*5001)) $BLOB_FILE &&
|
||||||
|
git config gc.pruneExpire 2.days.ago &&
|
||||||
|
git gc --no-prune &&
|
||||||
|
test 1 = $(git count-objects | sed "s/ .*//") &&
|
||||||
|
test -f $BLOB_FILE
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'gc respects gc.pruneExpire' '
|
||||||
|
|
||||||
|
git config gc.pruneExpire 5002.days.ago &&
|
||||||
|
git gc &&
|
||||||
|
test -f $BLOB_FILE &&
|
||||||
|
git config gc.pruneExpire 5000.days.ago &&
|
||||||
|
git gc &&
|
||||||
|
test ! -f $BLOB_FILE
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'gc --prune=<date>' '
|
||||||
|
|
||||||
|
BLOB=$(echo aleph_0 | git hash-object -w --stdin) &&
|
||||||
|
BLOB_FILE=.git/objects/$(echo $BLOB | sed "s/^../&\//") &&
|
||||||
|
test-chmtime =-$((86400*5001)) $BLOB_FILE &&
|
||||||
|
git gc --prune=5002.days.ago &&
|
||||||
|
test -f $BLOB_FILE &&
|
||||||
|
git gc --prune=5000.days.ago &&
|
||||||
|
test ! -f $BLOB_FILE
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user