【发布时间】:2014-01-13 06:42:57
【问题描述】:
我正在编写一个脚本供一些同事在他们的 Git 存储库上使用,但我对如何可靠地找到存储库工作树的根感到困惑:
通常,如果当前目录位于工作树中,则命令...
git rev-parse --git-dir
git rev-parse --show-toplevel
...将分别返回.git 目录和工作树的根。但是,如果当前目录恰好在 inside .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 的父目录是工作目录(或工作目录内的某处),但如果用户的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 目录没有保留对其工作树的引用?
提前感谢您的帮助/指点!
【问题讨论】:
标签: git