Git预提交挂钩-分支的签出不起作用



我有一个Git预提交挂钩的问题。

我的用例是:当我处于deatched head状态时,我想在提交完成之前签出master分支。主分支的签出需要通过外部工具来完成。

为了重现这个问题,我签出一个提交以进入分离的头状态,然后我执行一个提交:

git checkout 8060963376296d7d8286b0f7e37965e526442b4c
echo test >> file25.txt 
git add file25.txt
git commit -m "test commit"

Git显示以下错误消息,并且提交未完成:

fatal: cannot lock ref 'HEAD': is at b302d8f6806dffcb222f95ac10b4371dea6254c6 but expected 8060963376296d7d8286b0f7e37965e526442b4c

提交b302d8f6806ffcb222f95ac10b4371dea6254c6指向主分支。

我的预提交挂钩只包含一行:

exec "c:/temp/hook-test/checkout-branch.bat"

checkout-branch.bat文件也只包含一行用于签出主分支:

git checkout master

我的Git版本:

git --version
git version 2.21.0.windows.1

请注意:

  • 如果我执行命令";git结账主控器";直接在预提交挂钩中。但是对于我的用例,我必须调用一个外部应用程序
  • 上面的例子被简化了——我去掉了处理来检测分离头模式

有人知道如何解决这个问题吗?

钩子通常在一个稀疏的环境中运行,在这个环境中并不是所有的事情都是可能的。预提交挂钩不应尝试更改将提交的内容,也不能更改将添加提交的分支1预提交挂钩可以终止提交尝试,并且在导致提交尝试终止之前可以向用户打印建议,例如please check out a branch by name first。因此,在这里要做的是检查这种状态,抱怨,并使提交尝试失败。


1即使你找到了一些变通方法,一般来说也不是一个好主意。解决方法可能涉及运行额外的管道命令,但您会遇到扰乱正常索引/当前分支链接的危险,其方式类似于git push通常不会推送到已检出分支的原因。不要这样!

最新更新