如何防止在分离的HEAD中提交

时间:2016-05-17 06:51:44

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

为什么git允许你承诺分离头?有没有可以禁用它的预提交钩子?什么目的?许多新开发人员这样做,我想找到一种方法来禁用它。

3 个答案:

答案 0 :(得分:5)

这只能通过本地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意味着没有指向您正在处理的存储库状态的指针。它假设你知道你在做什么。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

Git在内部使用它进行许多操作。分离的HEAD模式只是让你进入(一个,一个,特殊的)匿名分支,以后可以为匿名分支命名。

例如,这是git rebase如何设法将提交从其原始链复制到新链。首先,它使用此分离的HEAD模式检出--onto目标提交(--onto默认为<upstream>)。然后,对于要复制的每个提交,它复制提交(使用git cherry-pick或等效的内容:详细信息因交互式与非交互式rebase而异,如果是交互式,则会有更多详细信息)。最后,它移动现有的分支标签,使其指向最终复制的提交。