首页 > 解决方案 > 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 中维护一个钩子文件。这是错误修剪。有什么想法和建议吗?

标签: gitgitlabgithooks

解决方案


更新挂钩无法添加新提交。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 来判断哪种更改。


推荐阅读