From: Eric Sunshine Date: Mon, 22 Sep 2014 22:19:55 GMT Subject: Re: [PATCH v2 23/32] prune: strategies for linked checkouts Message-ID: In-Reply-To: <20140921102936.GA9438@lanh> On Sun, Sep 21, 2014 at 6:29 AM, Duy Nguyen wrote: > Here we go again. Thanks both for the suggestions. > > -- 8< -- > Subject: [PATCH] prune: strategies for linked checkouts > > (alias R=$GIT_COMMON_DIR/worktrees/) > > - 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/ is to be pruned. > > - If $R/locked exists, worktrees/ 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 > Helped-by: Eric Sunshine > Signed-off-by: Nguyễn Thái Ngọc Duy > --- > Documentation/git-checkout.txt | 20 +++++++ > Documentation/git-prune.txt | 3 + > Documentation/gitrepository-layout.txt | 19 ++++++ > builtin/checkout.c | 19 +++++- > builtin/prune.c | 95 ++++++++++++++++++++++++++++++ > setup.c | 13 ++++ > t/t2026-prune-linked-checkouts.sh (new +x) | 84 ++++++++++++++++++++++++++ > 7 files changed, 251 insertions(+), 2 deletions(-) > create mode 100755 t/t2026-prune-linked-checkouts.sh > > diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt > index c101575..0fd3bab 100644 > --- a/Documentation/git-checkout.txt > +++ b/Documentation/git-checkout.txt > @@ -434,6 +434,26 @@ thumb is do not make any assumption about whether a path belongs to > $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. > > +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 > +--worktrees` in the main worktree or any linked work tree. Nit: In the rest of the documentation, you have consistently spelled out "working tree", so the (poor) example you copied from my email, which says "worktree", is an anomaly. My bad. Plus, you have a mix of "worktree" and "work tree". You probably want: ... in the main or any linked working tree. > +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 > +at least one git command inside the linked working directory > +(e.g. `git status`) in order to update its entry in $GIT_DIR/worktrees > +so that it does not get automatically removed. > + > +To prevent `git prune --worktrees` from deleting a $GIT_DIR/worktrees > +entry (which can be useful in some situations, such as when the > +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 > +plain text. For example, if a linked working tree's `.git` file points > +to `/path/main/.git/worktrees/test-next` then a file named > +`/path/main/.git/worktrees/test-next/locked` will prevent the > +`test-next` entry from being pruned. See > +linkgit:gitrepository-layout[5] for details. > + > EXAMPLES > -------- > > diff --git a/Documentation/git-prune.txt b/Documentation/git-prune.txt > index 7a493c8..a0ea381 100644 > --- a/Documentation/git-prune.txt > +++ b/Documentation/git-prune.txt > @@ -48,6 +48,9 @@ OPTIONS > --expire