1
0
mirror of https://github.com/git/git synced 2024-07-05 00:58:49 +00:00

prune: --grace=time

This option gives grace period to objects that are unreachable
from the refs from getting pruned.

The default value is 24 hours and may be changed using
gc.prunegrace.

Signed-off-by: Matthias Lederhofer <matled@gmx.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Matthias Lederhofer 2007-01-19 11:49:35 +01:00 committed by Junio C Hamano
parent a6c730644b
commit 9b088c4e39
6 changed files with 48 additions and 12 deletions

View File

@ -8,7 +8,7 @@ git-prune - Prunes all unreachable objects from the object database
SYNOPSIS
--------
'git-prune' [-n] [--] [<head>...]
'git-prune' [-n] [--grace=<time>]
DESCRIPTION
-----------
@ -28,6 +28,12 @@ OPTIONS
Do not remove anything; just report what it would
remove.
--grace=<time>::
Do not prune loose objects that are younger than the
specified time. This gives a grace period to newly
created objects from getting pruned.
////////////////////////////////////////////
\--::
Do not interpret any more arguments as options.
@ -46,6 +52,7 @@ borrows from your repository via its
------------
$ git prune $(cd ../another && $(git-rev-parse --all))
------------
////////////////////////////////////////////
Author
------

View File

@ -5,8 +5,9 @@
#include "builtin.h"
#include "reachable.h"
static const char prune_usage[] = "git-prune [-n]";
static const char prune_usage[] = "git-prune [-n] [--grace=time]";
static int show_only;
static int prune_grace_period;
static int prune_object(char *path, const char *filename, const unsigned char *sha1)
{
@ -38,6 +39,7 @@ static int prune_dir(int i, char *path)
char name[100];
unsigned char sha1[20];
int len = strlen(de->d_name);
struct stat st;
switch (len) {
case 2:
@ -60,6 +62,11 @@ static int prune_dir(int i, char *path)
if (lookup_object(sha1))
continue;
if (prune_grace_period > 0 &&
!stat(mkpath("%s/%s", path, de->d_name), &st) &&
st.st_mtime > prune_grace_period)
continue;
prune_object(path, de->d_name, sha1);
continue;
}
@ -79,10 +86,25 @@ static void prune_object_dir(const char *path)
}
}
static int git_prune_config(const char *var, const char *value)
{
if (!strcmp(var, "gc.prunegrace")) {
if (!strcmp(value, "off"))
prune_grace_period = 0;
else
prune_grace_period = approxidate(value);
return 0;
}
return git_default_config(var, value);
}
int cmd_prune(int argc, const char **argv, const char *prefix)
{
int i;
struct rev_info revs;
prune_grace_period = time(NULL)-24*60*60;
git_config(git_prune_config);
for (i = 1; i < argc; i++) {
const char *arg = argv[i];
@ -90,6 +112,13 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
show_only = 1;
continue;
}
if (!strncmp(arg, "--grace=", 8)) {
if (!strcmp(arg+8, "off"))
prune_grace_period = 0;
else
prune_grace_period = approxidate(arg+8);
continue;
}
usage(prune_usage);
}

View File

@ -96,7 +96,7 @@ test_expect_success setup '
check_have A B C D E F G H I J K L &&
git prune &&
git prune --grace=off &&
check_have A B C D E F G H I J K L &&
@ -115,7 +115,7 @@ test_expect_success rewind '
check_have A B C D E F G H I J K L &&
git prune &&
git prune --grace=off &&
check_have A B C D E F G H I J K L &&
@ -160,7 +160,7 @@ test_expect_success 'reflog expire' '
test_expect_success 'prune and fsck' '
git prune &&
git prune --grace=off &&
check_fsck &&
check_have A B C D E H L &&

View File

@ -55,13 +55,13 @@ test_expect_success setup '
test_expect_success 'pack the source repository' '
git repack -a -d &&
git prune
git prune --grace=off
'
test_expect_success 'pack the destination repository' '
cd victim &&
git repack -a -d &&
git prune &&
git prune --grace=off &&
cd ..
'

View File

@ -22,7 +22,7 @@ echo second > file2 &&
git add file2 &&
git commit -m addition &&
git repack -a -d &&
git prune'
git prune --grace=off'
cd "$base_dir"
@ -56,7 +56,7 @@ echo third > file3 &&
git add file3 &&
git commit -m update &&
git repack -a -d &&
git prune'
git prune --grace=off'
cd "$base_dir"

View File

@ -29,7 +29,7 @@ echo "Hello World" > file1 &&
git add file1 &&
git commit -m "Initial commit" file1 &&
git repack -a -d &&
git prune'
git prune --grace=off'
cd "$base_dir"
@ -39,7 +39,7 @@ echo "foo bar" > file2 &&
git add file2 &&
git commit -m "next commit" file2 &&
git repack -a -d -l &&
git prune'
git prune --grace=off'
cd "$base_dir"
@ -49,7 +49,7 @@ echo "Goodbye, cruel world" > file3 &&
git add file3 &&
git commit -m "one more" file3 &&
git repack -a -d -l &&
git prune'
git prune --grace=off'
cd "$base_dir"