如何根据作者获得修订范围的`git diff`?

时间:2017-04-12 20:58:22

标签: git

我的git log看起来像这样:

commit 5757cbb4380322121747c78040aad08540b3c707
Author: Fabio M. Costa <email@email.com>
Date:   Tue Apr 11 11:26:29 2017 -0700

    comment 1

commit 5431794f78df3cba720bdfa8331db0c0f75a80fd
Author: Fabio M. Costa <email@email.com>
Date:   Tue Apr 11 11:23:41 2017 -0700

    comment 2

commit ad4ee4efb35e74552b4dc617d92b5ae99fdc1f3c
Author: Other Author <otherguy@email.com>
Date:   Wed Apr 12 09:07:32 2017 -0700

    ...

我想展示我所有差异之间的差异,从HEAD开始,然后停在我作为作者的最后一个。

对于此示例,我可以通过运行git diff HEAD~2..HEAD手动完成此操作,但我想知道如何根据作者自动执行此操作。

1 个答案:

答案 0 :(得分:0)

我不知道如何在一行中完成,但这是一个简单的bash脚本:

#!/usr/bin/env bash

email="$1"
upto="$(awk '{print NR-1 " " $0}' <(git log --pretty=format:'%ae' HEAD) | grep $email | head -n 1 | awk '{ print $1 }')"
from="$(awk '{print NR-1 " " $0}' <(git log --pretty=format:'%ae' HEAD~$upto) | grep -v $email | head -n 1 | awk '{ print $1 }')"
git log HEAD~$from..HEAD~$upto

解释

从给定的email

中查找第一个提交

首先,列出HEAD只能打印作者电子邮件时可以访问的所有提交:

git log --pretty=format:'%ae' HEAD

然后,将行号(从0开始)添加到从上面命令返回的每个提交中:

awk '{print NR-1 " " $0}' <(git log --pretty=format:'%ae' HEAD)

然后,只选择给定email的提交:

awk '{print NR-1 " " $0}' <(git log --pretty=format:'%ae' HEAD) | grep $email

然后,获得给定email的第一次提交:

awk '{print NR-1 " " $0}' <(git log --pretty=format:'%ae' HEAD) | grep $email | head -n 1

然后,获取行号,它表示来自HEAD的提交次数:

awk '{print NR-1 " " $0}' <(git log --pretty=format:'%ae' HEAD) | grep $email | head -n 1 | awk '{ print $1 }'

最后,将其存储到$upto变量中,因为它是范围的顶部:

upto="$(awk '{print NR-1 " " $0}' <(git log --pretty=format:'%ae' HEAD) | grep $email | head -n 1 | awk '{ print $1 }')"

找到第一个不是来自给定email的提交,它是在第一次提交之后

该命令类似于两个不同之处:

  • 我们需要找到可以从HEAD~$from
  • 到达的提交
  • 我们需要选择不是来自给定email的第一个提交。

因此,突出显示差异的命令是:

from="$(awk '{print NR-1 " " $0}' <(git log --pretty=format:'%ae' HEAD~$upto) | grep -v $email | head -n 1 | awk '{ print $1 }')"
                                                                  ^^^^^^^^^^         ^^

打印日志

最后,打印从第一次提交到非给定email的提交日志到来自给定email的第一次提交:

git log HEAD~$from..HEAD~$upto

修改尽管如评论所示,使用分支并执行git log master..HEAD比此解决方案更受欢迎。