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

101

实验表明,似乎git的hooks在运行时当前目录被设置为仓库的根目录。然而,在git文档中我没有看到任何保证这一点的说明。我应该依赖于当前工作目录来定位git仓库,还是有更好的方法来确定与hook相关联的git仓库?


4
不确定这与什么有关。在一个安装了Git 2.7.3(-r1)的Gentoo稳定版系统中,git钩子不仅在.git目录中执行,而且使用git reset --hard实际上会在.git目录内创建工作目录结构,这在我看来是完全错误的做法! - Pavel Šimerda
3个回答

114

目前的答案似乎已经过时了。截至2.9.0版本,文档说明如下:

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

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


23
很好的回答。在后续修订版(2.13.0)中进行了澄清:“在推送期间触发的钩子(pre-receive、update、post-receive、post-update、push-to-checkout)始终在$GIT_DIR中执行,这是一个例外。” - Novice C
3
以上引用的来源/上下文:https://git-scm.com/docs/githooks#_description - jmcker
3
简单来说,它是您存储库的顶级目录。 (“Bare”基本上是指仅由.git目录组成且没有检出文件的存储库。) - Ben Mares

46

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


6
$GIT_DIR 是否有末尾斜杠? - PuercoPop
11
这不是正确的答案。GIT_DIR并不总是设置为仓库的根目录。请参阅此博客。 - Ghopper21
2
@Ghopper21 那篇文章也不是完全正确的。它说对于 post-commit 钩子,当前目录是工作树的顶层。然而,我的非常简单的 post-commit 脚本没有在工作树的顶层找到其他脚本。例如:.git/hooks/post-commit: 1: .git/hooks/post-commit: post-commit_push_gitweb.sh: not found - Vince

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

1
$GIT_DIR/.. 指向仓库根目录的可能性有多大? - David Lord
这不是绝对可靠的。不要使用 $GIT_DIR/..。当存储库是裸仓库时,它会出现错误。 裸仓库没有工作目录,因此没有“存储库根目录”。而且如果 .git 是一个链接,它也会出现错误。 - holygeek
2
有想过在正常使用情况下获取仓库根目录吗?比如说,对于一个使用仓库作为程序配置文件的 pre-commit 钩子来说。 - David Lord
3
并非所有情况下都是正确的。请参阅此博客 - Ghopper21

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接