управляйте несколькими рабочими деревьями (Manage multiple working trees)
Детали (Details)
Each linked working tree has a private sub-directory in the
repository's $GIT_DIR/worktrees
directory. The private
sub-directory's name is usually the base name of the linked
working tree's path, possibly appended with a number to make it
unique. For example, when $GIT_DIR=/path/main/.git
the command
git worktree add /path/other/test-next next
creates the linked
working tree in /path/other/test-next
and also creates a
$GIT_DIR/worktrees/test-next
directory (or
$GIT_DIR/worktrees/test-next1
if test-next
is already taken).
Within a linked working tree, $GIT_DIR
is set to point to this
private directory (e.g. /path/main/.git/worktrees/test-next
in
the example) and $GIT_COMMON_DIR
is set to point back to the main
working tree's $GIT_DIR
(e.g. /path/main/.git
). These settings
are made in a .git
file located at the top directory of the
linked working tree.
Path resolution via git rev-parse --git-path
uses either $GIT_DIR
or $GIT_COMMON_DIR
depending on the path. For example, in the
linked working tree git rev-parse --git-path HEAD
returns
/path/main/.git/worktrees/test-next/HEAD
(not
/path/other/test-next/.git/HEAD
or /path/main/.git/HEAD
) while
git rev-parse --git-path refs/heads/master
uses $GIT_COMMON_DIR
and returns /path/main/.git/refs/heads/master
, since refs are
shared across all working trees, except refs/bisect
and
refs/worktree
.
See gitrepository-layout(5) for more information. The rule of
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.
If you manually move a linked working tree, you need to update
the gitdir
file in the entry's directory. For example, if a
linked working tree is moved to /newpath/test-next
and its .git
file points to /path/main/.git/worktrees/test-next
, then update
/path/main/.git/worktrees/test-next/gitdir
to reference
/newpath/test-next
instead. Better yet, run git worktree repair
to reestablish the connection automatically.
To prevent a $GIT_DIR/worktrees
entry from being pruned (which
can be useful in some situations, such as when the entry's
working tree is stored on a portable device), use the git
worktree lock
command, which adds 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 gitrepository-layout(5)
for details.
When extensions.worktreeConfig
is enabled, the config file
.git/worktrees/<id>/config.worktree
is read after .git/config
is.