我正在为一些同事编写一个脚本,用于他们的Git存储库,我对如何可靠地找到repo工作树的根目录感到困惑:
通常,如果当前目录位于工作树内,则命令为......
git rev-parse --git-dir
git rev-parse --show-toplevel
...将分别返回.git
目录和工作树的根。但是,如果当前目录恰好是 in .git
目录,则只有 first 命令有效。命令git rev-parse --show-toplevel
没有显示工作树的顶层(至少,不适合我,在Linux上使用git 1.8.4.4)。
假设git rev-parse --is-bare-repository
返回false
,我通常会猜测git rev-parse --git-dir
的父目录是工作目录(或工作目录内的某个地方),但是如果用户的{ {1}}设置为GIT_DIR
目录不在工作目录中,不起作用。 (例如,当用户使用子模块时,他们的GIT_DIR可能不在他们的工作树中。)
我感到困惑的是,当在.git
内运行时,GIT_DIR
不会输出任何错误消息并返回0:
git rev-parse --show-toplevel
然而,在某个显然不是git存储库的地方运行相同的命令会返回错误代码:
$ cd $(git rev-parse --git-dir); git rev-parse --show-toplevel ; echo $?
0
如果有办法从$ cd /; git rev-parse --show-toplevel ; echo $?
fatal: Not a git repository (or any of the parent directories): .git
128
找到工作树,有人可以告诉我如何......或者是否根本无法从.git目录中获取工作树的位置,帮助我理解为什么,哲学上,.git目录不保留对其工作树的引用?
提前感谢您的帮助/指示!
答案 0 :(得分:6)
为什么,哲学上,.git目录不保留对其工作树的引用?
因为您可以在任何地方设置所述工作树(使用--work-tree
选项或GIT_WORK_TREE
环境变量),包括在(并且它是目标)不包括的地方.git
文件夹。
git config
man page确实提到了:
该值可以是绝对路径,也可以是
.git
目录路径的绝对路径,该路径由--git-dir
或GIT_DIR
指定,或自动发现。
如果指定--git-dir
或GIT_DIR
但未指定--work-tree
,GIT_WORK_TREE
和core.worktree
,则当前工作目录将被视为您工作的最高级别树。
所以它更像是基于工作树文件夹的约定(为了找到.git
)而不是反向(从.git
文件夹中推导出工作树)。
话虽如此,我列出了所有可以让您了解“How to find the path of the local git repository when I am possibly in a subdirectory”中工作树文件夹的命令。