过滤git log - 由第二个父进程的commiter进行

时间:2017-02-05 23:24:19

标签: git version-control

给出以下git历史记录的例子:

  .-A---M---N---O---P---Q
 /     /   /   /   /   /
I     B   C   D   E   Y
 \   /   /   /   /   /
  `-------------'   X

并假设:

  • A...Q都是合并提交
  • A...QA...Q
  • 的第一个父级
  • B...Y是包含A...Q
  • 的第二个父级的行
  • BDY的提交者是Josephine
  • CE的提交者是Lucian

如何在A...Q合并Lucian的作品中列出提交?

1 个答案:

答案 0 :(得分:1)

使用单个git log命令无法执行此操作。关键问题是第3项:

  1. 事实:顶行A---Q都是合并提交
  2. 要求:仅选择顶线提交...
  3. 要求:仅合并Lucian的工作(显然是每个提交者姓名或提交者电子邮件,但我们可以很容易地测试作者;见下文)
  4. 因为这需要测试每个合并的第二个父的提交者。 --author=--committer=提供的测试会测试提交本身,即,如果我们首先选择了合并,我们将检查合并本身的作者或提交者。

    因此,解决方案是将git log的面向脚本的兄弟git rev-list与脚本结合使用。毫无疑问,编写脚本有多种方法,但对我来说最明显的是使用git rev-list来首先选择所有可能有趣的合并提交。

    我不清楚(因为这是git loggit 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