【发布时间】:2017-08-24 00:21:23
【问题描述】:
考虑下一个创建所需 git 日志的伪代码:
git checkout master
git checkout -b 123-test-branch-1
git commit -m "#123 b1 c1"
git commit -m "#123 b1 c2"
git push
git checkout master
git checkout -b 456-test-branch-2
git commit -m "#456 b2 c1"
git commit -m "#456 b2 c2"
git push
git checkout 123-test-branch-1
git merge 456-test-branch-2
git commit -m "#123 b1 c3"
git push
在现实世界中,我在远程 git 存储库中的 update 挂钩验证分支名称和提交消息格式。分支名称和提交消息必须包含问题编号,例如123-test-branch-1 和#123 b1 c1 中的问题编号为123。推送分支时,挂钩从分支中提取问题编号并提交消息并进行比较。如果它们不相等,则钩子退出并出错。
当我推送只有“自己的”提交的分支时,这很好用。但是,上面的 git log 示例,推送分支 123-test-branch-1 具有来自合并分支 456-test-branch-2 的提交,因此钩子尝试仅将来自两个分支的所有提交与推送分支 123-test-branch-1 进行比较,并以错误退出,因为来自 456-test-branch-2 的提交具有问题编号456,当需要 123 时。
为了接收提交,我使用git log --pretty=%s ${oldRef}..${newRef},其中oldRef 和newRef 是“更新”挂钩参数。
所以,我的问题是如何解决这个问题。以某种方式对每个分支进行分组提交,或过滤来自现在推送的分支的提交(但如果 456-test-branch-2 是本地分支并且从未推送且从未验证,则挂钩可能会跳过无效提交)或其他内容。
【问题讨论】:
-
您还应该考虑这样一种情况:用户等待并在最后执行一个
git push origin 123-test-branch-1 456-test-branch-2,而不是三个单独的git push命令。 -
@torek,在这种情况下,
update钩子将运行两次,对于每个推送的分支,对于123-test-branch-1,git log 将与三个git push命令相同,对吧?如果是这样,问题是一样的:提交,从456-test-branch-2合并将被处理。 -
正确,更新挂钩每次更新运行一次。这就是为什么我建议,至少对于合并遍历,使用
--first-parent。您可能还想精确限制 谁 可以进行合并和/或何时进行。对于一些非常花哨的东西(尽管仍有缺陷),请参阅我的示例预接收挂钩 here。