获取git中每个分支的提交;更新;钩
考虑下一个创建所需git日志的伪代码:获取git中每个分支的提交;更新;钩,git,hook,githooks,Git,Hook,Githooks,考虑下一个创建所需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 p
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
在现实世界中,myupdate
hook在远程git存储库中验证分支名称和提交消息格式。分支名称和提交消息必须包含问题编号,例如,在123-test-Branch-1
和#123 b1 c1
中,问题编号为123
。推送分支时,钩子从分支中提取问题编号,提交消息并进行比较。如果它们不相等,钩子将带着错误退出
当我推送只有“自己”提交的分支时,这非常有效。但是,上面的git日志示例,推送分支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
是本地分支并且从未推送并且从未验证,钩子可能会跳过无效的提交),或者其他一些事情。更新钩子没有获得足够的信息:它无法获得传入哈希ID的“全局视图”。接收前或接收后钩子不会,1因此至少在某些方面会获得足够的信息
最大的问题在于新分支的创建。例如,假设一个更新正在传递名称refs/heads/a
和refs/heads/b
,其中两个名称都是新的(它们的旧散列是空散列),并且refs/heads/a
要提交的点N2
和refs/heads/b
要提交的点N3
:
N2 <-- A
/
...--O--O--O--N1
\
N3 <-- B
很明显,这三个N
提交是“新的”,但您应该将N1
分配给哪个分支
对于这一点,没有单一的正确答案。毕竟,提交N1
在两个分支上
在任何情况下,如果您更关心合并提交,例如:
...O1--O2--N1--N2 <-- A
/
...-O3--O4--N3 <-- B
…O1--O2--N1--N2更新挂钩没有获得足够的信息:它无法获得传入哈希ID的“全局视图”。接收前或接收后钩子不会,1因此至少在某些方面会获得足够的信息
最大的问题在于新分支的创建。例如,假设一个更新正在传递名称refs/heads/a
和refs/heads/b
,其中两个名称都是新的(它们的旧散列是空散列),并且refs/heads/a
要提交的点N2
和refs/heads/b
要提交的点N3
:
N2 <-- A
/
...--O--O--O--N1
\
N3 <-- B
很明显,这三个N
提交是“新的”,但您应该将N1
分配给哪个分支
对于这一点,没有单一的正确答案。毕竟,提交N1
在两个分支上
在任何情况下,如果您更关心合并提交,例如:
...O1--O2--N1--N2 <-- A
/
...-O3--O4--N3 <-- B
<代码>……O1- O2-N1—N2可能有帮助:我认为这更有用:你应该考虑的是,而不是三个单独的<代码> Git Pux命令,用户等待并执行一个代码> Git推送原点123-Test-BouCH-1146测试分支<2/代码>结束。@ ToRek,在这种情况下,<代码> Update < /Cord> HOK将运行两次,对于每个推送分支和123-test-branch-1
git日志将与三个git push
命令相同,对吗?如果是这样,问题是相同的:将处理从456-test-branch-2
合并的提交。正确,每次更新都会运行一次更新挂钩。这就是为什么我建议,至少对于合并遍历,使用--第一个父对象。您可能还想精确地限制谁可以进行合并和/或何时进行合并。对于一些很有意思的东西(虽然仍然有缺陷),请参阅我的样本预接收钩子。也许这个帮助:我认为这更有用:你也应该考虑这样的情况,而不是三个单独的代码> Git Pux命令,用户等待并执行一个代码> Git推送原点123-Test-BangCH-1 -46-测试分支-2/代码>结尾。在这种情况下,update
钩子将运行两次,对于每个推送的分支,123-test-branch-1
git日志将与三个git推送
命令相同,对吗?如果是这样,问题是相同的:将处理从456-test-branch-2
合并的提交。正确,每次更新都会运行一次更新挂钩。这就是为什么我建议,至少对于合并遍历,使用--第一个父对象。您可能还想精确地限制谁可以进行合并和/或何时进行合并。要了解一些非常奇特的东西(尽管仍然有缺陷),请参阅我的预接收钩子示例?此命令可以显示提交首次出现的分支。这种方法有局限性:默认情况下,由于git gc,只有最后90天可用,但在大多数情况下,这是可以接受的解决方案。因此,我可以找到所有提交的分支,由hook(update
或pre-receive
)截取,并为每个分支运行验证;(2) 仅在启用重登录(可选)时才有效;(3)对于钩子来说最重要的是,它只在创建分支的机器上工作,而不是在接收推送的服务器上(在服务器上,默认情况下也会禁用reflogs)。在远程repo上使用git reflog
进行几次实验后,我可以说基于reflog的解决方案不起作用。你能更详细地解释一下我是如何找到布兰的吗