[英]filter git log --merges by commiter of the second parent
给出下面的 git 历史示例:
.-A---M---N---O---P---Q
/ / / / / /
I B C D E Y
\ / / / / /
`-------------' X
并假设:
A...Q
都是合并提交A...Q
是与第一父行A...Q
B...Y
是A...Q
第二个父级B
, D
和Y
提交者是 JosephineC
和E
提交者是 Lucian 我怎样才能列出A...Q
中的提交,只合并 Lucian 的工作?
您无法使用单个git log
命令执行此操作。 关键问题是第 3 项:
A---Q
都是合并提交 因为这需要测试每个合并的第二个父级的提交者。 --committer=
--author=
和--committer=
测试测试提交本身,即,如果我们首先选择了合并,我们将检查合并本身的作者或提交者。
因此,解决方案是将git log
的面向脚本的兄弟git rev-list
与脚本结合使用。 毫无疑问,编写脚本的方法有多种,但对我来说最明显的是使用git rev-list
首先选择所有可能有趣的合并提交。
我不清楚(因为这是git log
和git rev-list
文档中的图表)您的意思是暗示只有这些提交,还是可能有更多的“内部”合并,例如,也许X
不是单个提交,而是可能包含其自己的分支和合并的整个提交链。 如果你只想要顶级提交,你可以使用--first-parent
,或者如果你有一个--ancestry-path
例如--ancestry-path I..Q
,你可以使用它。 将--merges
添加到您想要获得所有顶级合并或所有合并的任何限制:
git rev-list --merges Q |
git rev-list
的输出将包括所有合并提交,现在我们编写剩余的管道,它测试每个合并并丢弃它,除非第二个父级的作者或提交者是我们想要的:
git rev-list --merges Q |
while read rev; do
p2=$(git rev-parse ${rev}^2)
person=$(git log --no-walk --pretty=format:%cn $p2) # or %aN or %ce etc
[ "$person" == "who we want" ] && echo $rev
done
这个小脚本的输出是要查看的提交集,因此我们只需将其通过管道传输到git log --stdin --no-walk
即可获得最终输出:
git rev-list --merges Q |
while read rev; do
p2=$(git rev-parse ${rev}^2)
person=$(git log --no-walk --pretty=format:%cn $p2)
[ "$person" == "who we want" ] && echo $rev
done |
git log --stdin --no-walk # add formatting etc as desired
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.