获取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日志的伪代码:

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
在现实世界中,my
update
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的解决方案不起作用。你能更详细地解释一下我是如何找到布兰的吗