【问题标题】:Why is .git/hooks sometimes missing in cloned repos?为什么克隆的 repos 中有时会缺少 .git/hooks?
【发布时间】:2016-02-14 08:01:36
【问题描述】:

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

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

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

我挖掘了有关缺少 .git/hook 目录的问题/答案,但没有在 SO 或更广泛的范围内找到任何内容。 Git 文档 mentions 表明 repo 初始化确保 (.git/hooks/) .sample 文件默认是可执行的;但我真的找不到任何东西似乎可以解释为什么我的克隆存储库有时包含 .git/hooks 而有时不包含。

谁能解释一下这里的因果关系?谢谢。

【问题讨论】:

  • 你找到解释了吗?我刚遇到这个问题。从 Bitbucket 服务器克隆存储库时缺少 .git/hooks。不知道是不是SourceTree缺陷。

标签: git githooks atlassian-sourcetree


【解决方案1】:

在 git 存储库中定义的钩子始终位于该存储库的本地。它们不属于 git 历史记录,在克隆、获取或推送时不会被转移。

因此,仅通过使用钩子克隆现有存储库,克隆存储库将没有任何上游钩子。您必须手动将它们添加到克隆的存储库中。

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

【讨论】:

  • 感谢您的解释;你提到的问题也很好地解释了。我仍然想知道的是,一些克隆中的.git/hooks 目录来自哪里,如果我按照相同的过程创建和开始使用每个克隆,为什么克隆之间的.git/hooks'存在/不存在不会是一致的。
【解决方案2】:

几年后我会发布这个。

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

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

【讨论】:

  • 你让我的生活变得轻松
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2022-12-18
    • 1970-01-01
    • 2017-01-10
    • 2018-02-08
    相关资源
    最近更新 更多