gc: support prune --worktrees

Helped-by: Marc Branchaud <marcnarc@xiplink.com>
Signed-off-by: Marc Branchaud <marcnarc@xiplink.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nguyễn Thái Ngọc Duy 2014-11-30 15:24:53 +07:00 committed by Junio C Hamano
parent 09dbb90b09
commit e3df33bb1b
3 changed files with 24 additions and 4 deletions

View File

@ -1229,6 +1229,13 @@ gc.pruneexpire::
"now" may be used to disable this grace period and always prune "now" may be used to disable this grace period and always prune
unreachable objects immediately. unreachable objects immediately.
gc.pruneworktreesexpire::
When 'git gc' is run, it will call
'prune --worktrees --expire 3.months.ago'.
Override the grace period with this config variable. The value
"now" may be used to disable the grace period and prune
$GIT_DIR/worktrees immediately.
gc.reflogexpire:: gc.reflogexpire::
gc.<pattern>.reflogexpire:: gc.<pattern>.reflogexpire::
'git reflog expire' removes reflog entries older than 'git reflog expire' removes reflog entries older than

View File

@ -435,8 +435,11 @@ $GIT_DIR or $GIT_COMMON_DIR when you need to directly access something
inside $GIT_DIR. Use `git rev-parse --git-path` to get the final path. inside $GIT_DIR. Use `git rev-parse --git-path` to get the final path.
When you are done with a linked working tree you can simply delete it. When you are done with a linked working tree you can simply delete it.
You can clean up any stale $GIT_DIR/worktrees entries via `git prune The working tree's entry in the repository's $GIT_DIR/worktrees
--worktrees` in the main or any linked working tree. directory will eventually be removed automatically (see
`gc.pruneworktreesexpire` in linkgit::git-config[1]), or you can run
`git prune --worktrees` in the main or any linked working tree to
clean up any stale entries in $GIT_DIR/worktrees.
If you move a linked working directory to another file system, or If you move a linked working directory to another file system, or
within a file system that does not support hard links, you need to run within a file system that does not support hard links, you need to run
@ -444,8 +447,8 @@ at least one git command inside the linked working directory
(e.g. `git status`) in order to update its entry in $GIT_DIR/worktrees (e.g. `git status`) in order to update its entry in $GIT_DIR/worktrees
so that it does not get automatically removed. so that it does not get automatically removed.
To prevent `git prune --worktrees` from deleting a $GIT_DIR/worktrees To prevent a $GIT_DIR/worktrees entry from from being pruned (which
entry (which can be useful in some situations, such as when the can be useful in some situations, such as when the
entry's working tree is stored on a portable device), add a file named entry's working tree is stored on a portable device), add a file named
'locked' to the entry's directory. The file contains the reason in 'locked' to the entry's directory. The file contains the reason in
plain text. For example, if a linked working tree's `.git` file points plain text. For example, if a linked working tree's `.git` file points

View File

@ -33,11 +33,13 @@ static int gc_auto_threshold = 6700;
static int gc_auto_pack_limit = 50; static int gc_auto_pack_limit = 50;
static int detach_auto = 1; static int detach_auto = 1;
static const char *prune_expire = "2.weeks.ago"; static const char *prune_expire = "2.weeks.ago";
static const char *prune_worktrees_expire = "3.months.ago";
static struct argv_array pack_refs_cmd = ARGV_ARRAY_INIT; static struct argv_array pack_refs_cmd = ARGV_ARRAY_INIT;
static struct argv_array reflog = ARGV_ARRAY_INIT; static struct argv_array reflog = ARGV_ARRAY_INIT;
static struct argv_array repack = ARGV_ARRAY_INIT; static struct argv_array repack = ARGV_ARRAY_INIT;
static struct argv_array prune = ARGV_ARRAY_INIT; static struct argv_array prune = ARGV_ARRAY_INIT;
static struct argv_array prune_worktrees = ARGV_ARRAY_INIT;
static struct argv_array rerere = ARGV_ARRAY_INIT; static struct argv_array rerere = ARGV_ARRAY_INIT;
static char *pidfile; static char *pidfile;
@ -83,6 +85,7 @@ static void gc_config(void)
git_config_get_int("gc.autopacklimit", &gc_auto_pack_limit); git_config_get_int("gc.autopacklimit", &gc_auto_pack_limit);
git_config_get_bool("gc.autodetach", &detach_auto); git_config_get_bool("gc.autodetach", &detach_auto);
git_config_date_string("gc.pruneexpire", &prune_expire); git_config_date_string("gc.pruneexpire", &prune_expire);
git_config_date_string("gc.pruneworktreesexpire", &prune_worktrees_expire);
git_config(git_default_config, NULL); git_config(git_default_config, NULL);
} }
@ -290,6 +293,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
argv_array_pushl(&reflog, "reflog", "expire", "--all", NULL); argv_array_pushl(&reflog, "reflog", "expire", "--all", NULL);
argv_array_pushl(&repack, "repack", "-d", "-l", NULL); argv_array_pushl(&repack, "repack", "-d", "-l", NULL);
argv_array_pushl(&prune, "prune", "--expire", NULL); argv_array_pushl(&prune, "prune", "--expire", NULL);
argv_array_pushl(&prune_worktrees, "prune", "--worktrees", "--expire", NULL);
argv_array_pushl(&rerere, "rerere", "gc", NULL); argv_array_pushl(&rerere, "rerere", "gc", NULL);
gc_config(); gc_config();
@ -359,6 +363,12 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
return error(FAILED_RUN, prune.argv[0]); return error(FAILED_RUN, prune.argv[0]);
} }
if (prune_worktrees_expire) {
argv_array_push(&prune_worktrees, prune_worktrees_expire);
if (run_command_v_opt(prune_worktrees.argv, RUN_GIT_CMD))
return error(FAILED_RUN, prune_worktrees.argv[0]);
}
if (run_command_v_opt(rerere.argv, RUN_GIT_CMD)) if (run_command_v_opt(rerere.argv, RUN_GIT_CMD))
return error(FAILED_RUN, rerere.argv[0]); return error(FAILED_RUN, rerere.argv[0]);