为什么.git/hooks有时在克隆回购协议中缺失?

为什么.git/hooks有时在克隆回购协议中缺失?,git,githooks,atlassian-sourcetree,Git,Githooks,Atlassian Sourcetree,我有几个(Git for Windows 2.6.2 64位)repo是我用相同的方法创建和启动的: 在git Bash中运行git init--bare.git 使用SourceTree克隆新的repo 添加和提交初始文件(通过SourceTree或EGit) 废话,废话,废话 在尝试向这些克隆的repo添加一个公共的post-commithook时,我注意到其中只有一些具有.git/hooks目录。为什么? 我搜索了有关缺少.git/hook目录的问题/答案,但没有找到关于这方面或更广泛的内

我有几个(Git for Windows 2.6.2 64位)repo是我用相同的方法创建和启动的:

  • 在git Bash中运行
    git init--bare.git
  • 使用SourceTree克隆新的repo
  • 添加和提交初始文件(通过SourceTree或EGit)
  • 废话,废话,废话
  • 在尝试向这些克隆的repo添加一个公共的
    post-commit
    hook时,我注意到其中只有一些具有
    .git/hooks
    目录。为什么?

    我搜索了有关缺少
    .git/hook
    目录的问题/答案,但没有找到关于这方面或更广泛的内容。repo初始化确保(
    .Git/hooks/
    .sample
    文件默认可执行的Git文档;但我真的找不到任何东西来解释为什么我克隆的回购协议有时包含
    .git/hooks
    ,有时不包含


    有人能解释一下这里的因果关系吗?谢谢。

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

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


    解释一些帮助您实现这一点的选项。

    因为在克隆等过程中不会传输git钩子。因此,很多时候钩子都是在单独的目录中定义的(在未克隆或传输的.git目录之外)

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

    这是可能的,因为您可以轻松配置git,将
    core.hooksPath
    配置变量设置为托管挂钩目录,例如:
    几年后,我发布了这篇文章

    这看起来确实像是一个SourceTree的东西(正如上面Jason的理论)。更具体地说,如果使用SourceTree中的
    嵌入式Git
    。如果我使用
    systemgit
    (我在Mac上),那么
    hooks
    目录将被创建并填充样本。通过命令行进行克隆也会产生相同的结果。使用
    嵌入式Git
    时,没有
    挂钩
    目录

    首选项中的
    git
    选项截图,您可以在这两个选项之间进行选择


    谢谢你的解释;你提到的问题也解释得很好。我仍然想知道的是,一些克隆中的
    .git/hooks
    目录来自何处,如果我按照相同的过程创建并开始使用每个克隆,为什么
    .git/hooks
    “存在/不存在在克隆中并不一致。您找到了对此的解释吗?我刚刚遇到了这个问题。从Bitbucket服务器克隆存储库时缺少git/hooks。我想知道这是否是SourceTree缺陷。