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:
parent
09dbb90b09
commit
e3df33bb1b
@ -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
|
||||||
|
@ -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
|
||||||
|
10
builtin/gc.c
10
builtin/gc.c
@ -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]);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user