我有一个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
通常不会推送到已检出分支的原因。不要这样!