我正在尝试获取来自合并的所有提交哈希。我的最终目标是获取这些提交者的电子邮件,并在合并破坏构建的情况下向他们发送电子邮件。但是,我不确定如何解决此问题。这需要完全在终端中完成,因为它将由詹金斯(Jenkins)自动化。
我尝试过的一种方法可能是在合并提交和最后一次添加到master的提交之间找到提交。但是,显然这些似乎与时间戳相吻合。
我想到的另一种方法是找到已合并到master的分支,然后将所有哈希值放在那里。但是,我不知道执行此操作的命令。
我目前正在使用它来查找合并提交哈希(和电子邮件)
git log -1 --merges -pretty=format:%H
git log -1 --merges -pretty=format%ae
预期结果是,我应该获得所有提交的哈希值,并能够找到这些提交者的电子邮件地址。
答案 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 foo
从foo
指定的提交中排除所有可到达的提交,包括提交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
。