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

Git:触发a";“机器人”;合并主分支时提交,git,gitlab,githooks,Git,Gitlab,Githooks,我有master分支机构和团队成员的其他分支机构主控与产品同步。我希望在MR从其他分支合并到master中时,再提交一个升级版本(更改一个文件内容,比如'release.md'),不管做了什么更改 这适用于运行在ubuntu 16.04系统上的gitlab v11.10.4。 首先,我想在gitlab服务器端设置一个git钩子(更新钩子)。在脚本中,我需要执行以下操作:1)检查目标合并分支是否是主分支2)如果是,检查提交消息是否与“升级版本”不同3)如果不是,则在合并之前添加其他提交 touch

我有
master
分支机构和团队成员的其他分支机构<代码>主控与产品同步。我希望在MR从其他分支合并到master中时,再提交一个升级版本(更改一个文件内容,比如'release.md'),不管做了什么更改

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

touch release.md
git提交-a-m“升级版本”
我知道,在更新钩子中,我可以得到参数“refname”、“oldrev”和“newrev”,理论上我可以从中解析信息以完成步骤1)和步骤2)。但是我不知道如何向这个分支添加额外的commit

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

更新挂钩不能添加新提交。1更新挂钩的功能是接受或拒绝名称更改。2要接受名称更改,请退出零。要拒绝名称更改,请退出非零

对于这种情况,您应该做的是验证对
refs/heads/master
进行更改的用户是否进行了正确的更改。如果没有,则拒绝更改请求。执行
git推送的用户必须进行正确的注释。您只需验证注释是否存在并正确。如果没有,则生成错误消息:此错误将显示给运行
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:
错误消息,如下所示:

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

1从技术上讲,在Git钩子中做鬼鬼祟祟的事情是可能的。但是,分支名称更改需要锁定。此时提议的更新的锁已经到位,因此更新挂钩无法向提议的更新分支名称添加新提交,因为这需要锁定已经锁定的锁,这意味着等待拥有锁的用户(即您自己)完成验证操作。这是一个典型的死锁。理论上,您可以更新其他分支,因为这样您就不用等待自己了。但总的来说这是个坏主意


2“更改”是指:创建引用(例如,新分支)、删除引用(例如,删除分支)或就地更新(例如,向分支添加新提交,或由于强制推送操作而从分支中删除提交)。通过检查旧的和新的哈希ID,并使用<代码> GIT Rev列表
如果需要的话,你可以告诉你哪种改变。

< P>如果你不想在开发者方面强制执行这个策略,并且仍然坚持把“升级版本”元数据(“Meta”作为“它不是一个数据”,这是“源代码”),那么你可以考虑。
git notes
添加、删除或读取附加到对象的注释,而不接触对象本身

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

  • 新的提交是在master上完成的
  • 新提交是合并提交(双亲)

在这种情况下,它可以向该提交添加注释,指定它是“升级版本”“好样的。不必弄乱提交的历史记录。

感谢您对更新挂钩的详细解释和一般用法。我想我可以在服务器端做一些鬼鬼祟祟的事情,因为我把所有的对象都存储在服务器上。但你是对的,这并不是实际应该如何使用钩子。我不确定这是否能解决我的问题。回到使用点,像“将版本升级到XXX”这样的提交的主要好处是,如果我的产品有bug,则需要修复(测试通过,但未检测到潜在问题)。我可以通过检查提交消息回滚到特定版本。因为我的提交历史可能类似于“ABACADEAF……”,其中“a”表示我的升级提交。另一个好处是,开发人员可以获得develop@milanow是的,当然可以使用git notes回滚到正确的提交:您的备注将包括提交SHA1(如中所示)。您的两个使用点都得到了解决。使用笔记。