繁体   English   中英

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

[英]Git: trigger a "robot" commit when a master branch is merged

我的团队成员有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”的参数,理论上我可以从中解析信息以完成步骤 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

用户将看到以remote:为前缀的ERROR消息,如下所示:

remote: ERROR
remote: ERROR: you must supply a commit with a correct message
remote: ...

1从技术上讲,这可以做到的事情偷偷摸摸Git的挂钩。 但是,分支名称更改需要锁定。 此时,建议更新的锁已经就位,因此更新挂钩无法向建议更新分支名称添加新的提交,因为这需要锁定已经锁定的锁,这意味着等待已锁定的用户锁,也就是你自己,完成验证操作。 这是一个经典的僵局。 理论上,您可以更新其他一些分支,因为这样您就不必等待自己了。 但总的来说,这是一个坏主意。

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

如果您不想在开发人员方面强制执行该政策,并且仍然坚持添加“升级版本”元数据(“元”为“它不是“数据”,而是“源代码”),那么您可能会考虑git notes

git notes添加、删除或读取附加到对象的注释,而无需接触对象本身。

这意味着您的更新,甚至 post-receive hook 可以检查:

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

在这种情况下,它可以向该提交添加注释,指定它是“升级版本”类型。 不必惹提交的历史。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM