我正在为一些同事编写一个脚本,用于他们的Git存储库,我对如何可靠地找到repo工作树的根目录感到困惑:
通常,如果当前目录位于工作树内,则命令...
git rev-parse --git-dir git rev-parse --show-toplevel
...将分别返回.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可能不在他们的工作树中.)
我发现令人困惑的是,当在a内运行时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目录不保留对其工作树的引用?
在此先感谢您的帮助/指针!
为什么,哲学上,.git目录不保留对其工作树的引用?
因为您可以在任何地方设置所述工作树(使用--work-tree
选项或 GIT_WORK_TREE
环境变量),包括在(并且它是目标)不包括.git
文件夹的位置.
该git config
手册页确实提到:
该值可以是绝对路径,也可以是相对于
.git
目录路径的路径,该路径由--git-dir
或指定GIT_DIR
,或自动发现.
如果--git-dir
或GIT_DIR
指定了但没有--work-tree
,GIT_WORK_TREE
而core.worktree
被指定,当前的工作目录被认为是你的工作树的最高水平.
所以它更像是一个基于工作树文件夹的约定(为了找到它.git
)而不是反向(从.git
文件夹中推导出工作树).
话虽这么说,我列出了所有可以让你了解工作树文件夹的命令," 当我可能在子目录中时如何找到本地git存储库的路径 ".