git - Git:合并主分支时触发“机器人”提交
问题描述
我的团队成员有master
分支和其他分支。master
与产品同步。当 MR 从其他分支合并到 master 时,无论进行了哪些更改,我都希望再次提交升级版本(更改文件内容为“release.md”)。
这是一个 gitlab v11.10.4,在 ubuntu 16.04 系统上运行。一开始,我想在gitlab服务器端设置一个git hook(更新钩子)。在脚本中,我需要做:1)检查目标合并分支是否是主分支 2)如果是,检查提交的消息不像“升级版本” 3)如果不是,那么在合并之前添加一个额外的提交。
touch release.md
git commit -a -m "upgrade version"
我知道在更新挂钩中我可以获得“refname”、“oldrev”和“newrev”的参数,理论上我可以从中解析信息以完成步骤 1)和步骤 2)。但我不知道如何向这个分支添加额外的提交。
在本地钩子(git add . blahblah)中很容易,但这样我团队中的每个开发人员都需要在任何 repo 的 .git 中维护一个钩子文件。这是错误修剪。有什么想法和建议吗?
解决方案
更新挂钩无法添加新提交。1 更新挂钩的功能是接受或拒绝名称更改。2 要接受名称更改,请退出零。要拒绝名称更改,请退出非零值。
对于这种情况,您应该做的是验证进行更改的用户refs/heads/master
是否进行了正确的更改。如果不是,则拒绝更改请求。执行此操作的用户git push
必须做出正确的注释。您只需验证注释是否存在且正确。如果没有,则生成错误消息:此错误将显示给正在运行的用户git push
,并以单词 为前缀remote:
。
换句话说,如果你这样做:
echo "ERROR"
echo "ERROR: you must supply a commit with a correct message"
echo "ERROR: ... describe enough to tell the user what that is ..."
echo "ERROR"
exit 1
用户将看到以ERROR
为前缀的消息remote:
,如下所示:
remote: ERROR
remote: ERROR: you must supply a commit with a correct message
remote: ...
1从技术上讲,可以在 Git 钩子中做鬼鬼祟祟的事情。但是,分支名称更改需要锁定。此时建议更新的锁已经到位,因此更新挂钩无法将新提交添加到建议更新分支名称,因为这需要锁定已经锁定的锁,这意味着等待已锁定的用户锁,也就是你自己,来完成验证操作。这是一个经典的僵局。理论上您可以更新其他一些分支,因为您不会等待自己。但总的来说,这是一个坏主意。
2 “更改”是以下之一:创建引用(例如,新分支)、删除引用(例如,删除分支)或就地更新(例如,向分支添加新提交,或从分支中删除提交由于强制推动操作)。git rev-list
您可以通过检查旧哈希 ID 和新哈希 ID 并根据需要使用if/as 来判断哪种更改。