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:
parent
a6c730644b
commit
9b088c4e39
@ -8,7 +8,7 @@ git-prune - Prunes all unreachable objects from the object database
|
|||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
'git-prune' [-n] [--] [<head>...]
|
'git-prune' [-n] [--grace=<time>]
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
@ -28,6 +28,12 @@ OPTIONS
|
|||||||
Do not remove anything; just report what it would
|
Do not remove anything; just report what it would
|
||||||
remove.
|
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.
|
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))
|
$ git prune $(cd ../another && $(git-rev-parse --all))
|
||||||
------------
|
------------
|
||||||
|
////////////////////////////////////////////
|
||||||
|
|
||||||
Author
|
Author
|
||||||
------
|
------
|
||||||
|
@ -5,8 +5,9 @@
|
|||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "reachable.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 show_only;
|
||||||
|
static int prune_grace_period;
|
||||||
|
|
||||||
static int prune_object(char *path, const char *filename, const unsigned char *sha1)
|
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];
|
char name[100];
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
int len = strlen(de->d_name);
|
int len = strlen(de->d_name);
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
switch (len) {
|
switch (len) {
|
||||||
case 2:
|
case 2:
|
||||||
@ -60,6 +62,11 @@ static int prune_dir(int i, char *path)
|
|||||||
if (lookup_object(sha1))
|
if (lookup_object(sha1))
|
||||||
continue;
|
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);
|
prune_object(path, de->d_name, sha1);
|
||||||
continue;
|
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 cmd_prune(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct rev_info revs;
|
struct rev_info revs;
|
||||||
|
prune_grace_period = time(NULL)-24*60*60;
|
||||||
|
|
||||||
|
git_config(git_prune_config);
|
||||||
|
|
||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
const char *arg = argv[i];
|
const char *arg = argv[i];
|
||||||
@ -90,6 +112,13 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
|
|||||||
show_only = 1;
|
show_only = 1;
|
||||||
continue;
|
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);
|
usage(prune_usage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ test_expect_success setup '
|
|||||||
|
|
||||||
check_have A B C D E F G H I J K L &&
|
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 &&
|
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 &&
|
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 &&
|
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' '
|
test_expect_success 'prune and fsck' '
|
||||||
|
|
||||||
git prune &&
|
git prune --grace=off &&
|
||||||
check_fsck &&
|
check_fsck &&
|
||||||
|
|
||||||
check_have A B C D E H L &&
|
check_have A B C D E H L &&
|
||||||
|
@ -55,13 +55,13 @@ test_expect_success setup '
|
|||||||
|
|
||||||
test_expect_success 'pack the source repository' '
|
test_expect_success 'pack the source repository' '
|
||||||
git repack -a -d &&
|
git repack -a -d &&
|
||||||
git prune
|
git prune --grace=off
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'pack the destination repository' '
|
test_expect_success 'pack the destination repository' '
|
||||||
cd victim &&
|
cd victim &&
|
||||||
git repack -a -d &&
|
git repack -a -d &&
|
||||||
git prune &&
|
git prune --grace=off &&
|
||||||
cd ..
|
cd ..
|
||||||
'
|
'
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ echo second > file2 &&
|
|||||||
git add file2 &&
|
git add file2 &&
|
||||||
git commit -m addition &&
|
git commit -m addition &&
|
||||||
git repack -a -d &&
|
git repack -a -d &&
|
||||||
git prune'
|
git prune --grace=off'
|
||||||
|
|
||||||
cd "$base_dir"
|
cd "$base_dir"
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ echo third > file3 &&
|
|||||||
git add file3 &&
|
git add file3 &&
|
||||||
git commit -m update &&
|
git commit -m update &&
|
||||||
git repack -a -d &&
|
git repack -a -d &&
|
||||||
git prune'
|
git prune --grace=off'
|
||||||
|
|
||||||
cd "$base_dir"
|
cd "$base_dir"
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ echo "Hello World" > file1 &&
|
|||||||
git add file1 &&
|
git add file1 &&
|
||||||
git commit -m "Initial commit" file1 &&
|
git commit -m "Initial commit" file1 &&
|
||||||
git repack -a -d &&
|
git repack -a -d &&
|
||||||
git prune'
|
git prune --grace=off'
|
||||||
|
|
||||||
cd "$base_dir"
|
cd "$base_dir"
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ echo "foo bar" > file2 &&
|
|||||||
git add file2 &&
|
git add file2 &&
|
||||||
git commit -m "next commit" file2 &&
|
git commit -m "next commit" file2 &&
|
||||||
git repack -a -d -l &&
|
git repack -a -d -l &&
|
||||||
git prune'
|
git prune --grace=off'
|
||||||
|
|
||||||
cd "$base_dir"
|
cd "$base_dir"
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ echo "Goodbye, cruel world" > file3 &&
|
|||||||
git add file3 &&
|
git add file3 &&
|
||||||
git commit -m "one more" file3 &&
|
git commit -m "one more" file3 &&
|
||||||
git repack -a -d -l &&
|
git repack -a -d -l &&
|
||||||
git prune'
|
git prune --grace=off'
|
||||||
|
|
||||||
cd "$base_dir"
|
cd "$base_dir"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user