有没有办法找到Git仓库的工作树,给出它的.git目录?

时间:2014-01-13 06:42:58

标签: git

我正在为一些同事编写一个脚本,用于他们的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目录不保留对其工作树的引用?

提前感谢您的帮助/指示!

1 个答案:

答案 0 :(得分:6)

  

为什么,哲学上,.git目录不保留对其工作树的引用?

因为您可以在任何地方设置所述工作树(使用--work-tree选项或GIT_WORK_TREE环境变量),包括在(并且它是目标)不包括的地方.git文件夹。

git config man page确实提到了:

  

该值可以是绝对路径,也可以是.git目录路径的绝对路径,该路径由--git-dirGIT_DIR指定,或自动发现。
  如果指定--git-dirGIT_DIR但未指定--work-treeGIT_WORK_TREEcore.worktree,则当前工作目录将被视为您工作的最高级别树。

所以它更像是基于工作树文件夹的约定(为了找到.git)而不是反向(从.git文件夹中推导出工作树)。

话虽如此,我列出了所有可以让您了解“How to find the path of the local git repository when I am possibly in a subdirectory”中工作树文件夹的命令。