繁体   English   中英

按第二个父级的提交者过滤 git log --merges

[英]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...YA...Q第二个父级
  • B , DY提交者是 Josephine
  • CE提交者是 Lucian

我怎样才能列出A...Q中的提交,只合并 Lucian 的工作?

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

  1. 事实:第一行A---Q都是合并提交
  2. 要求:仅选择顶级提交...
  3. 要求:仅合并 Lucian 的作品(显然是每个提交者姓名或提交者电子邮件,但我们可以轻松地测试作者;见下文)

因为这需要测试每个合并的第二个父级的提交者。 --committer= --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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM