给出以下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
的提交者是Josephine C
和E
的提交者是Lucian 如何在A...Q
合并Lucian的作品中列出提交?
答案 0 :(得分:1)
使用单个git log
命令无法执行此操作。关键问题是第3项:
A---Q
都是合并提交因为这需要测试每个合并的第二个父的提交者。 --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