如何从合并中获取所有提交哈希?合并的提交按时间戳对齐

时间:2019-11-08 03:54:03

标签: git email jenkins version-control blame

我正在尝试获取来自合并的所有提交哈希。我的最终目标是获取这些提交者的电子邮件,并在合并破坏构建的情况下向他们发送电子邮件。但是,我不确定如何解决此问题。这需要完全在终端中完成,因为它将由詹金斯(Jenkins)自动化。

我尝试过的一种方法可能是在合并提交和最后一次添加到master的提交之间找到提交。但是,显然这些似乎与时间戳相吻合。

我想到的另一种方法是找到已合并到master的分支,然后将所有哈希值放在那里。但是,我不知道执行此操作的命令。

我目前正在使用它来查找合并提交哈希(和电子邮件)

git log -1 --merges -pretty=format:%H
git log -1 --merges -pretty=format%ae

预期结果是,我应该获得所有提交的哈希值,并能够找到这些提交者的电子邮件地址。

2 个答案:

答案 0 :(得分:0)

如果您有合并提交,请先尝试:

git log --pretty=format:\"%%H\" M~...M

这将列出从M〜或M都可以访问但从M〜和M都不能访问的所有提交。

这就是在M的第二个父级上完成的所有提交。
在下面:M-x-x

M
| \
M~ \
|   x
m   |
|   x
m   /
|  /
o  

答案 1 :(得分:0)

  

我正在尝试获取来自合并的所有提交哈希。

如果您要控制是否执行合并,那么您会遇到一个理想的情况,因为您可以轻松枚举合并后可以到达的提交,而合并之前当前无法到达的提交。 (由于合并不会改变图形的较早部分,因此合并后您仍然可以获得相同的结果。)

假设您正在提交中,其哈希为H,位于分支mainline的顶端,并且您即将(但尚未)发出命令:

git merge feature

引入feature中尚未出现的mainline中的提交,例如:

...--o--*--o--o--H   <-- mainline
         \
          E--F----G   <-- feature

此合并将带来的提交列表-并没有合并的更改有趣,因为例如F可能只是一个直接还原E,以便仅提交G确实很重要-只需列举以下内容即可:

git log mainline..feature

您可能想控制枚举的顺序。在下引号之后,请参见下文。

请注意,合并后 您具有:

...--o--*--o--o--H--M   <-- mainline
         \         /
          E--F----G   <-- feature

和带来的提交是M^1..M^2枚举的。 (这假设一个简单的两技巧合并会导致真正的合并提交。八达通合并是可枚举的,但需要更高级的语法,而快进合并不会记录mainline的前一技巧,并且在分析之后很麻烦-事实。

  

我尝试过的一种方法可能是在合并提交和最后一次添加到master的提交之间找到提交。但是,显然这些似乎与时间戳相吻合。

git log命令使用优先级队列遍历提交图。您的“按时间戳划分”观察是由于队列中项目的优先级。您可能只想使用--topo-order来控制此优先级。

整个循环的结构如下:

  • All 插入服从命令行的否定符,例如--not foofoo指定的提交中排除所有可到达的提交,包括提交foo本身。 (这会影响下一点的初始化和下面的迭代。)

  • git log将通过在命令行中插入所有直接/肯定提及的提交作为起点来初始化队列。如果未提及提交,请插入HEAD。 (此处的“肯定”是指B ^A正面引用B,负面引用A的事实。因此,A..B排除了{{1 }},就像A一样。)

  • 现在,当队列为非空时,--not A运行:

    • 从队列中删除前端提交并使用它。
    • 将未提交但尚未访问的,已提交的任何父级(通过任何选定的“历史简化”或其他选项(包括父级重写)修改)插入队列中。

队列为空后,退出整个过程。

鉴于合并定义为两个或多个父提交,遍历的任何git log步骤都有可能在队列中插入两个或多个提交。当然,队列也可以开始,其中有两个或多个提交。每当队列没有有两次或更多次提交时,优先级决定哪个提交在队列中的哪个位置。

默认优先级是按提交者日期确定的,较高的值(较晚的日期)移到队列的最前面。但是:

  • git log确保孩子先于父母。否则,它与默认值相同。

  • --date-order使用作者日期而不是提交者日期,否则与--author-date-order相同(父母在所有后代之后出现 )。

  • --date-order避免交错合并的分支。

有关详细信息,请参见the git log documentation。请注意,--topo-order意味着--graph