有没有一种方法,可以在给定一个.git目录的情况下找到Git仓库的工作树?

10
我正在为我的同事撰写一份脚本,用于在他们的Git代码库上使用,我对如何可靠地找到工作树的根目录感到困惑:

通常,如果当前目录位于工作树内,则命令...

git rev-parse --git-dir
git rev-parse --show-toplevel

如果当前目录不在.git目录中,那么运行命令git rev-parse --show-cdupgit rev-parse --show-prefix将分别返回.git目录的根目录和工作树。但是,如果当前目录恰好位于.git目录内部,则只有第一个命令有效。使用命令git rev-parse --show-toplevel不能显示工作树的顶级目录(至少对我来说,在Linux上使用git 1.8.4.4时不行)。

假设git rev-parse --is-bare-repository返回false,我通常会猜测git rev-parse --git-dir的父目录要么是工作目录(或者在工作目录内的某个地方),但是如果用户设置了GIT_DIR,那么.git目录就不在工作目录内,这种情况下该方法就不适用。(例如,当用户使用子模块时,他们的GIT_DIR可能不在他们的工作树内。)

让我感到困惑的是,当在GIT_DIR内运行时,git rev-parse --show-toplevel不打印错误消息并返回0:

$ cd $(git rev-parse --git-dir); git rev-parse --show-toplevel ; echo $?
0

当在明显不是git仓库的位置运行相同的命令时,会返回一个错误代码:

$ cd /; git rev-parse --show-toplevel ; echo $?
fatal: Not a git repository (or any of the parent directories): .git
128

如果有一种方法可以从GIT_DIR中找到工作树,那么能否告诉我如何实现...或者如果无法从.git目录派生出工作树的位置,帮助我理解为什么哲学上.git目录不保留对其工作树的引用?
提前感谢您的帮助/提示!
2个回答

9
因为你可以使用--work-tree选项或GIT_WORK_TREE环境变量在任何你想要的地方设置工作目录,包括不包含.git文件夹的地方(这是目标)。git config手册页面提到:

该值可以是绝对路径或相对于.git目录的路径,该目录由--git-dirGIT_DIR指定或自动发现。
如果指定了--git-dirGIT_DIR,但未指定--work-treeGIT_WORK_TREEcore.worktree中的任何一个,则当前工作目录被视为工作树的顶层。

因此,这更多是基于工作树文件夹的约定(为了找到.git),而不是相反的方式(从.git文件夹推导工作树)。
话虽如此,我列出了所有可以让您了解工作树文件夹的命令,详见“当我可能在子目录中时如何找到本地git存储库路径的方法”。

0
显然,git worktree list 是有效的:
~/kde6/src/appstream/.git$ git worktree list 
/home/bam/kde6/src/appstream  563e5d46 [main]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接