【问题标题】:How to prevent commit in detached HEAD如何防止在分离的 HEAD 中提交
【发布时间】:2016-05-17 06:51:43
【问题描述】:

为什么 git 允许你提交一个超然的头脑?是否有任何可以禁用它的预提交钩子?什么目的?许多新开发人员都这样做,我想找到一种方法来禁用它。

【问题讨论】:

    标签: git pre-commit-hook git-detached-head


    【解决方案1】:

    这只能通过本地 git pre-commit 挂钩来防止,因此开发人员需要创建它。添加your-local-project/.git/hooks/pre-commit文件,内容如下:

    #!/bin/sh
    
    if ! git symbolic-ref HEAD &> /dev/null; then
      echo "You are in a detached head state! Commit has been blocked. (Use --no-verify to bypass this check.)"
      exit 1
    fi
    

    确保它是可执行的。 Credits go to svachalek

    为什么 git 应该阻止在分离的 HEAD 中提交?分离的 HEAD 意味着 only 没有指向您正在处理的存储库状态的指针。它假定您知道自己在做什么。

    我宁愿调查为什么你们团队中的许多开发人员会进入这种状态?也许他们应用了一些奇怪的工作流程?

    【讨论】:

    • 虽然这会阻止提交到分离的头部,但它也会干扰(交互式)变基操作。在内部,rebase 使用分离的头来重放提交。
    • 允许变基需要 detecting them 在钩子中。但是,我很难想象一个开发人员会同时进行交互式 rebase 并且害怕在分离的 HEAD 中提交。
    【解决方案2】:

    git checkout $commit-sha1 会导致 HEAD 分离。 git checkout FETCH_HEAD 也是如此。一个分离的 HEAD 可以被认为是一个没有名字的分支。如果它不会让你感到困惑,你可以忽略它。正如@fracz 所说,您可以通过pre-commit 阻止它。您也可以将其设为名称为git checkout -b some_name 的分支。 post-checkout 钩子可以帮助您检测分离的 HEAD 状态并使其成为分支。

    【讨论】:

    • +1 表示在 post-checkout 挂钩中创建分支的想法。但是,它必须创建具有随机名称的分支,这反过来又会随着时间的推移造成很大的混乱。
    • @fracz 是的,随机分支名称确实是个问题。我们可以使用一些逻辑来找到一个合适的名称,但相比之下它仍然有点麻烦。所以就忽略它或找到根本原因并提前预防。据我所知,repo sync 没有 repo start 如果正在使用 Repo,也可能导致分离 HEAD 状态。
    • post-commit 钩子中创建分支可以避免在用户实际上不想提交任何内容时创建分支。见gist.github.com/ben-cohen/316f89c763e9d8a027335261a44c4954
    【解决方案3】:

    Git 在内部将它用于许多操作。分离的 HEAD 模式只是让您进入(一个、单个、特殊的)匿名分支,并且可以稍后为匿名分支命名。

    这是,例如,git rebase 如何设法将提交从其原始链复制到新链。首先,它使用这种分离的 HEAD 模式检查 --onto 目标提交(--onto 默认为 <upstream>)。然后,对于要复制的每个提交,它都会复制该提交(使用git cherry-pick 或等效的东西:细节取决于交互式和非交互式 rebase,如果是交互式的,还有更多细节)。最后,它移动现有的分支标签,使其指向最终复制的提交。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-20
      • 2011-06-18
      • 2015-03-03
      • 2022-01-12
      • 2013-08-23
      • 2021-08-30
      • 2012-05-26
      • 1970-01-01
      相关资源
      最近更新 更多