在git钩子中,当前工作目录是否保证在git存储库中?


81

在实验上,似乎git hooks在当前目录设置为存储库根目录的情况下运行。但是,我在git文档中看不到任何保证。我应该依靠当前的工作目录来定位git存储库,还是有一种更好的方法来计算与该挂钩相关联的git存储库?


4
不知道有多少相关。在带有Git 2.7.3(-r1)的Gentoo稳定盒上,不仅在其中执行git钩子,.git而且git reset --hard实际上在目录内部创建了工作目录结构.git,我认为这是完全错误的事情!
PavelŠimerda'16

Answers:


45

它基于为环境变量设置的值GIT_DIR。当挂钩开始运行时,它将设置为存储库的根目录。许多挂钩,尤其是那些从另一个仓库中拉出的挂钩,会根据需要取消设置(并重置)此环境变量。


6
$ GIT_DIR是否带有斜杠?
PuercoPop 2012年

8
这不是正确的答案。GIT_DIR并不总是设置为存储库的根目录。请参阅此博客
Ghopper21

2
@ Ghopper21那篇文章也不是完全正确的。它说,对于提交后挂钩,当前目录是工作树的顶层。但是,我非常简单的提交后脚本在工作树的顶层找不到其他脚本。例如:.git/hooks/post-commit: 1: .git/hooks/post-commit: post-commit_push_gitweb.sh: not found
文斯

67

当前答案似乎已过时。从2.9.0版开始,文档规定以下内容:

在Git调用钩子之前,它将其工作目录更改为非裸存储库中工作树的根目录,或裸存储库中的$ GIT_DIR。

https://git-scm.com/docs/githooks/2.9.0


11
好答案。在以后的版本(2.13.0)中进行了澄清。“一个例外是始终在$ GIT_DIR中执行的在推送(预接收,更新,后接收,更新后,推送到签出)期间触发的挂钩。”
新手C

2
以上引用的来源/上下文:git-scm.com/docs/githooks#_description
jmcker

用简单的语言:这是您存储库的顶级目录。(“裸露”实质上是指仅由.git目录组成且没有检出文件的存储库。)
Ben Mares

4

您可以使用环境变量$GIT_DIR$GIT_DIR指向.git目录。


$GIT_DIR/..指向存储库根的可能性有多大?
大卫·洛德

这不是万无一失的。不要使用$GIT_DIR/..。当回购是裸回购时,这将中断。裸仓库没有工作目录,因此没有“存储库根目录”。当.git代替链接时,它也会中断。
holygeek

1
想通了。在正常使用情况下,有什么方法可以获取回购根目录?例如,对于一个使用存储库作为程序配置文件的预提交挂钩?
David Lord

3
这并非在所有情况下都是正确的。请参阅此博客
Ghopper21 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.