prune: strategies for linked checkouts
(alias R=$GIT_COMMON_DIR/worktrees/<id>) - linked checkouts are supposed to keep its location in $R/gitdir up to date. The use case is auto fixup after a manual checkout move. - linked checkouts are supposed to update mtime of $R/gitdir. If $R/gitdir's mtime is older than a limit, and it points to nowhere, worktrees/<id> is to be pruned. - If $R/locked exists, worktrees/<id> is not supposed to be pruned. If $R/locked exists and $R/gitdir's mtime is older than a really long limit, warn about old unused repo. - "git checkout --to" is supposed to make a hard link named $R/link pointing to the .git file on supported file systems to help detect the user manually deleting the checkout. If $R/link exists and its link count is greated than 1, the repo is kept. Helped-by: Marc Branchaud <marcnarc@xiplink.com> Helped-by: Eric Sunshine <sunshine@sunshineco.com> Helped-by: Johannes Sixt <j6t@kdbg.org> 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:

committed by
Junio C Hamano

parent
529fef20cf
commit
23af91d102
13
setup.c
13
setup.c
@ -390,6 +390,17 @@ static int check_repository_format_gently(const char *gitdir, int *nongit_ok)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void update_linked_gitdir(const char *gitfile, const char *gitdir)
|
||||
{
|
||||
struct strbuf path = STRBUF_INIT;
|
||||
struct stat st;
|
||||
|
||||
strbuf_addf(&path, "%s/gitfile", gitdir);
|
||||
if (stat(path.buf, &st) || st.st_mtime + 24 * 3600 < time(NULL))
|
||||
write_file(path.buf, 0, "%s\n", gitfile);
|
||||
strbuf_release(&path);
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to read the location of the git directory from the .git file,
|
||||
* return path to git directory if found.
|
||||
@ -438,6 +449,8 @@ const char *read_gitfile(const char *path)
|
||||
|
||||
if (!is_git_directory(dir))
|
||||
die("Not a git repository: %s", dir);
|
||||
|
||||
update_linked_gitdir(path, dir);
|
||||
path = real_path(dir);
|
||||
|
||||
free(buf);
|
||||
|
Reference in New Issue
Block a user