From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: git@vger.kernel.org, gitster@pobox.com
Subject: [PATCH] gc: call "prune --expire 2.weeks.ago"
Date: Tue, 11 Mar 2008 21:58:20 +0100 (CET) [thread overview]
Message-ID: <alpine.LSU.1.00.0803112157560.3873@racer.site> (raw)
If "--prune" is passed to gc, it still just calls "git prune".
Otherwise, "prune --expire 2.weeks.ago" is called, where the grace
period is overrideable by the config variable gc.pruneExpire.
While adding a test to t5304-prune.sh (since it really tests the
implicit call to "prune"), the original test for "prune --expire"
is moved there from t1410-reflog.sh, where it did not belong.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
I am really tempted to reduce the grace period further, but
I'd like to hear opinions first. Is 3.days.ago too short?
Documentation/config.txt | 5 +++++
Documentation/git-gc.txt | 16 +++++++++++-----
builtin-gc.c | 19 +++++++++++++++++--
t/t1410-reflog.sh | 18 ------------------
t/t5304-prune.sh | 36 ++++++++++++++++++++++++++++++++++++
5 files changed, 69 insertions(+), 25 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 14df635..adde89a 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -590,6 +590,11 @@ gc.packrefs::
at some stage, and setting this to `false` will continue to
prevent `git pack-refs` from being run from `git gc`.
+gc.pruneexpire::
+ When `git gc` is run without `--prune`, it will still call
+ `prune`, but with `--expire 2.weeks.ago`. Override the value
+ with this config variable.
+
gc.reflogexpire::
`git reflog expire` removes reflog entries older than
this time; defaults to 90 days.
diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt
index 2e7be91..2042d9f 100644
--- a/Documentation/git-gc.txt
+++ b/Documentation/git-gc.txt
@@ -28,13 +28,19 @@ OPTIONS
--prune::
Usually `git-gc` packs refs, expires old reflog entries,
packs loose objects,
- and removes old 'rerere' records. Removal
+ and removes old 'rerere' records. Unilateral removal
of unreferenced loose objects is an unsafe operation
while other git operations are in progress, so it is not
- done by default. Pass this option if you want it, and only
- when you know nobody else is creating new objects in the
- repository at the same time (e.g. never use this option
- in a cron script).
+ done by default.
++
+Instead, `git-prune` is called with an option telling it to expire
+only unreferenced loose objects that are at least 2 weeks old. Set
+the config variable `gc.pruneexpire` to override this grace period.
++
+Pass `--prune` to expire all unreferenced loose objects, but only
+when you know nobody else is creating new objects in the
+repository at the same time (e.g. never use this option
+in a cron script).
--aggressive::
Usually 'git-gc' runs very quickly while providing good disk
diff --git a/builtin-gc.c b/builtin-gc.c
index 7cad366..8d07350 100644
--- a/builtin-gc.c
+++ b/builtin-gc.c
@@ -26,12 +26,13 @@ static int pack_refs = 1;
static int aggressive_window = 250;
static int gc_auto_threshold = 6700;
static int gc_auto_pack_limit = 20;
+static char *prune_expire = "2.weeks.ago";
#define MAX_ADD 10
static const char *argv_pack_refs[] = {"pack-refs", "--all", "--prune", NULL};
static const char *argv_reflog[] = {"reflog", "expire", "--all", NULL};
static const char *argv_repack[MAX_ADD] = {"repack", "-d", "-l", NULL};
-static const char *argv_prune[] = {"prune", NULL};
+static const char *argv_prune[] = {"prune", NULL, NULL, NULL};
static const char *argv_rerere[] = {"rerere", "gc", NULL};
static int gc_config(const char *var, const char *value)
@@ -55,6 +56,14 @@ static int gc_config(const char *var, const char *value)
gc_auto_pack_limit = git_config_int(var, value);
return 0;
}
+ if (!strcmp(var, "gc.pruneexpire")) {
+ if (!value)
+ return config_error_nonbool(var);
+ if (!approxidate(value))
+ return error("Invalid gc.pruneExpire: '%s'", value);
+ prune_expire = xstrdup(value);
+ return 0;
+ }
return git_default_config(var, value);
}
@@ -235,7 +244,13 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
if (run_command_v_opt(argv_repack, RUN_GIT_CMD))
return error(FAILED_RUN, argv_repack[0]);
- if (prune && run_command_v_opt(argv_prune, RUN_GIT_CMD))
+ if (!prune) {
+ argv_prune[1] = "--expire";
+ argv_prune[2] = prune_expire;
+ argv_prune[3] = NULL;
+ }
+
+ 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))
diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh
index 24476be..73f830d 100755
--- a/t/t1410-reflog.sh
+++ b/t/t1410-reflog.sh
@@ -202,22 +202,4 @@ test_expect_success 'delete' '
'
-test_expect_success 'prune --expire' '
-
- before=$(git count-objects | sed "s/ .*//") &&
- BLOB=$(echo aleph | 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 &&
- git reset --hard &&
- git prune --expire=1.hour.ago &&
- test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
- test -f $BLOB_FILE &&
- test-chmtime -86500 $BLOB_FILE &&
- git prune --expire 1.day &&
- test $before = $(git count-objects | sed "s/ .*//") &&
- ! test -f $BLOB_FILE
-
-'
-
test_done
diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh
index 6560af7..2a88b3f 100644
--- a/t/t5304-prune.sh
+++ b/t/t5304-prune.sh
@@ -29,4 +29,40 @@ test_expect_success 'prune stale packs' '
'
+test_expect_success 'prune --expire' '
+
+ before=$(git count-objects | sed "s/ .*//") &&
+ BLOB=$(echo aleph | 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 &&
+ git prune --expire=1.hour.ago &&
+ test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
+ test -f $BLOB_FILE &&
+ test-chmtime -86500 $BLOB_FILE &&
+ git prune --expire 1.day &&
+ test $before = $(git count-objects | sed "s/ .*//") &&
+ ! test -f $BLOB_FILE
+
+'
+
+test_expect_success 'gc: implicit prune --expire' '
+
+ before=$(git count-objects | sed "s/ .*//") &&
+ BLOB=$(echo aleph_0 | git hash-object -w --stdin) &&
+echo blob: $BLOB &&
+ BLOB_FILE=.git/objects/$(echo $BLOB | sed "s/^../&\//") &&
+ test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
+ test -f $BLOB_FILE &&
+ test-chmtime -$((86400*14-30)) $BLOB_FILE &&
+ git gc &&
+ test $((1 + $before)) = $(git count-objects | sed "s/ .*//") &&
+ test -f $BLOB_FILE &&
+ test-chmtime -$((86400*14+1)) $BLOB_FILE &&
+ git gc &&
+ test $before = $(git count-objects | sed "s/ .*//") &&
+ ! test -f $BLOB_FILE
+
+'
+
test_done
--
1.5.4.4.646.ge37ad
next reply other threads:[~2008-03-11 20:59 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-11 20:58 Johannes Schindelin [this message]
2008-03-12 2:13 ` [PATCH] gc: call "prune --expire 2.weeks.ago" Junio C Hamano
2008-03-12 2:37 ` Nicolas Pitre
2008-03-12 6:49 ` Junio C Hamano
2008-03-12 10:57 ` Johannes Schindelin
2008-03-12 15:45 ` Nicolas Pitre
2008-03-12 15:53 ` Pieter de Bie
2008-03-12 16:05 ` Johannes Schindelin
2008-03-12 17:01 ` Jeff King
2008-03-12 22:50 ` Pieter de Bie
2008-03-12 23:20 ` Junio C Hamano
2008-03-12 23:30 ` Johannes Schindelin
2008-03-12 23:41 ` Junio C Hamano
2008-03-12 16:20 ` Geert Bosch
2008-03-12 15:07 ` Nicolas Pitre
2008-03-12 15:32 ` Marko Kreen
2008-03-12 17:35 ` [PATCH v2] gc: call "prune --expire 2.weeks.ago" by default Johannes Schindelin
2008-03-12 17:56 ` Brandon Casey
2008-03-12 18:35 ` Jakub Narebski
2008-03-12 19:07 ` Johannes Schindelin
2008-03-12 19:12 ` Junio C Hamano
2008-03-12 19:38 ` Johannes Schindelin
2008-03-12 19:53 ` [PATCH v3] " Johannes Schindelin
2008-03-12 19:55 ` Johannes Schindelin
2008-03-12 19:55 ` [PATCH v2] " Brandon Casey
2008-03-12 19:59 ` Johannes Schindelin
2008-03-12 20:25 ` Brandon Casey
2008-03-12 20:35 ` Junio C Hamano
2008-03-12 20:55 ` [PATCH v4] " Johannes Schindelin
2008-03-12 20:56 ` Johannes Schindelin
2008-03-12 21:20 ` Junio C Hamano
2008-03-12 22:40 ` Nicolas Pitre
2008-03-12 22:50 ` Johannes Schindelin
2008-03-12 23:13 ` Junio C Hamano
2008-03-12 23:28 ` Johannes Schindelin
2008-03-12 23:39 ` Junio C Hamano
2008-03-12 23:43 ` Johannes Schindelin
2008-03-13 9:48 ` Wincent Colaiuta
2008-03-13 10:17 ` Johannes Sixt
2008-03-13 9:21 ` Wincent Colaiuta
2008-03-13 11:11 ` Johannes Schindelin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.LSU.1.00.0803112157560.3873@racer.site \
--to=johannes.schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).