我正在为我的同事撰写一份脚本,用于在他们的Git代码库上使用,我对如何可靠地找到工作树的根目录感到困惑:
如果有一种方法可以从
提前感谢您的帮助/提示!
通常,如果当前目录位于工作树内,则命令...
git rev-parse --git-dir
git rev-parse --show-toplevel
如果当前目录不在.git
目录中,那么运行命令git rev-parse --show-cdup
和git 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目录不保留对其工作树的引用?提前感谢您的帮助/提示!