Git:合并主分支时触发“机器人”提交

时间:2019-07-20 00:22:56

标签: git gitlab githooks

我有master个分支和团队成员的其他分支。 master已与产品同步。我想再进行一次其他提交,即当MR从其他分支合并到master时,无论已进行了什么更改,都将升级版本(将文件内容更改为“ release.md”)。

这是针对在ubuntu 16.04系统上运行的gitlab v11.10.4。 首先,我想在gitlab服务器端设置一个git钩子(更新钩子)。在脚本中,我需要执行以下操作:1)检查目标合并分支是否为master分支2)如果确实如此,请检查提交的消息是否类似于“升级版本” 3)如果不是,则在合并之前添加其他提交。

touch release.md
git commit -a -m "upgrade version"

我知道在更新钩子中我可以获得“ refname”,“ oldrev”和“ newrev”的args,理论上我可以从中解析信息以完成步骤1)和步骤2)。但我不知道如何向该分支添加其他提交。

在本地钩子中添加它很容易(git add。blahblah),但是这样,我们团队中的每个开发人员都需要在任何回购的.git中维护一个钩子文件。这是错误修剪。有什么想法和建议吗?

2 个答案:

答案 0 :(得分:1)

更新挂钩不能添加新的提交。 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钩子中做偷偷摸摸的事情。但是,分支名称更改需要锁定。此时,已针对建议的更新锁定了该锁,因此更新挂钩无法将新提交添加至proposal-update分支名称,因为这需要锁定已经锁定的锁,这意味着要等待拥有该锁的用户。锁(您自己)才能完成对操作的验证。这是一个典型的僵局。理论上,您可以更新某些 other 分支,因为那样您就不必等待自己了。但这通常是个坏主意。

2 “更改”是以下内容之一:创建引用(例如,新分支),删除引用(例如,删除分支),或就地更新(例如,由于强制推送操作而将新提交添加到分支,或从分支中删除提交)。您可以通过检查旧的和新的哈希ID并根据需要使用git rev-list来确定哪种更改。

答案 1 :(得分:0)

如果您不想在开发人员方面实施该策略,并且仍然坚持添加“升级版本”元数据(“元”为“它不是“数据”,即“源代码”)) ,那么您可以考虑使用git notes

git notes添加,删除或读取附加在对象上的注释,而无需自己触摸对象。

这意味着您的更新,甚至接收后挂钩都可以检查:

  • 新提交已在master上完成
  • 新提交是合并提交(两个父提交)

在这种情况下,它可以为该提交添加注释,并指定其为“升级版本”类型。 无需不必弄乱提交的历史。