为什么 .git/hooks 有时会在克隆的存储库中丢失?

Why is .git/hooks sometimes missing in cloned repos?

我有几个(Git for Windows 2.6.2 64-bit)我创建并开始使用相同方式的回购:

  1. 运行 git init --bare <repoName>.git 在 Git Bash.
  2. 使用 SourceTree 克隆新的存储库。
  3. 添加并提交初始文件(通过 SourceTree 或 EGit)。
  4. 废话,废话,废话....

在尝试向这些克隆的存储库添加通用 post-commit 挂钩时,我注意到 只有其中一些具有 .git/hooks 目录 。为什么?

我搜索了 questions/answers 关于丢失的 .git/hook 目录,但没有在 SO 或更广泛的地方找到任何东西。 Git 文档 mentions 回购初始化确保 (.git/hooks/) .sample 文件默认可执行;但我真的找不到任何似乎可以解释为什么我的克隆回购有时包含 .git/hooks 有时不包含的内容。

谁能阐明这里的因果关系?谢谢。

git 存储库中定义的挂钩始终位于该存储库的本地。它们不是 git 历史的一部分,并且在克隆、获取或推送时不会传输。

因此,只需克隆一个带有钩子的现有仓库,克隆仓库就会有 none 个上游钩子。您必须手动将它们添加到克隆的存储库中。

This question 解释了一些可帮助您实现此目的的选项。

由于 git 挂钩在克隆等时不会传输,因此很多时候挂钩是在单独的目录中定义的(在 .git 目录之外,该目录未被克隆或传输) .

这主要是团队项目和开源存储库的情况。因此他们可能有一些脚本(例如在他们的 Makefile 中)正在删除本地 .git/hooks 并添加一些其他包含挂钩的目录(例如 .githooks 在 repo 的根目录中)。

这是可能的,因为您可以轻松配置 git 以将 core.hooksPath 配置变量设置为您的托管挂钩目录,例如: git config core.hooksPath .githooks

几年后我会发布这个。

这看起来确实像是 SourceTree 的东西(正如上面 Jason 所理论的那样)。更具体地说,如果使用 SourceTree 中的 Embedded Git。如果我使用 System Git(我在 Mac 上),则会创建 hooks 目录并填充示例。通过命令行克隆会产生相同的结果。使用Embedded Git时,则没有hooks目录。

偏好设置中 git 选项的屏幕截图,您可以在其中 select 两者之间。