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

Dic*_*eed 75 git

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

Oha*_*der 48

目前的答案似乎已经过时了.从2.9.0开始,文档声明如下:

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

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

  • 很好的答案.在后来的修订中做了澄清(2.13.0).**"异常是在推送(预接收,更新,接收后,更新后,推送到结账)期间触发的挂钩,总是在$ GIT_DIR中执行."** (10认同)
  • 上述报价的来源/背景:https://git-scm.com/docs/githooks#_description (2认同)
  • 用简单的语言来说:它是存储库的顶级目录。(“裸”本质上是指仅由“.git”目录组成的存储库,并且没有签出任何文件。) (2认同)

man*_*lds 43

它基于为环境变量设置的值GIT_DIR.当钩子开始运行时,它被设置为存储库的根目录.许多钩子,特别是那些从另一个仓库中拉出来的钩子,根据需要取消(并重置)这个环境变量.

  • 这不是一个正确的答案.GIT_DIR并不总是设置为回购的根.见[此博客](http://longair.net/blog/2011/04/09/missing-git-hooks-documentation/). (7认同)
  • $ GIT_DIR有尾随斜杠吗? (6认同)
  • 不,不是的.见http://www.gelato.unsw.edu.au/archives/git/0505/3338.html (2认同)
  • 另见:http://longair.net/blog/2011/04/09/missing-git-hooks-documentation/ (2认同)
  • @ Ghopper21那篇文章也不是完全正确的。它说,对于提交后挂钩,当前目录是工作树的顶层。但是,我非常简单的提交后脚本在工作树的顶层找不到其他脚本。例如:`.git / hooks / post-commit:1:.git / hooks / post-commit:post-commit_push_gitweb.sh:未找到` (2认同)