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

时间:2015-11-12 20:38:10

标签: git githooks atlassian-sourcetree

我创建了几个(Git for Windows 2.6.2 64位)repos,并以相同的方式开始使用

  1. 在Git Bash中运行git init --bare <repoName>.git
  2. 使用SourceTree克隆新的仓库。
  3. 添加并提交初始文件(通过SourceTree或EGit)。
  4. Blah,等等,等等....
  5. 在尝试为这些克隆的repos添加一个公共post-commit钩子时,我注意到只有一些有一个.git/hooks目录。为什么呢?

    我挖掘了关于丢失.git/hook目录的问题/答案,并且没有在SO或更广泛地找到任何内容。重新初始化的Git文档mentions确保(.git/hooks/.sample文件在默认情况下是可执行的;但我真的找不到任何似乎可以解释为什么我的克隆回购有时包含.git/hooks而有时却没有。{/ p>

    谁能在这里发挥作用的原因和效果?感谢。

3 个答案:

答案 0 :(得分:4)

git存储库中定义的钩子始终是此存储库的本地。它们不是git历史的一部分,在克隆,获取或推送时不会被转移。

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

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

答案 1 :(得分:0)

由于git钩子在克隆等时没有被传输,因此很多时候钩子被定义在一个单独的目录中(在.git目录之外,没有被克隆或传输)。

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

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

答案 2 :(得分:0)

我将在几年后发布此内容。

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

首选项中 git 选项的屏幕截图,您可以在其中选择两者。

enter image description here