如何使用git cherry获取提交者电子邮件?

时间:2016-12-15 23:49:57

标签: git awk pipe git-log git-cherry

git cherry优于git log以获得两个分支之间的差异。问题是它的输出是有限的。

我正在尝试提取与提交相关联的电子邮件地址(或用户)。这就是我正在做的事情。

git cherry firstbranch secondbranch | awk '/^+/ {print $2}' | awk '{ system("git show $1"); }'

我得到的只是一次提交的细节。而不是我所做的每一次提交:

git cherry firstbranch secondbranch | awk '/^+/ {print $2}'

第二次管道操作出了问题。

我的问题是:如何使用git cherry获取提交者电子邮件?

2 个答案:

答案 0 :(得分:2)

这样的事情:

git cherry firstbranch secondbranch | awk '$0=$2' | git log --no-walk --stdin --pretty='%h %ce'
  1. - 不走路:只显示给定的提交,但不要遍历他们的祖先

  2. %h:缩写提交哈希

  3. %ce:提交者电子邮件

  4. Source

答案 1 :(得分:0)

git log --no-walk --stdin的管道{p> Steven Penny's approach是一种正确的方法,在最复杂的情​​况下是必需的(对所选提交ID进行复杂过滤)。

但是,有一些技巧可以用于这个特定的情况。如果您检查(广泛的,虽然令人困惑)documentation for git rev-list,您会找到选项--left-right--left-only--right-only--cherry-mark--cherry-pick,和--cherry

--left-right选项适用于任何对称差异,即A...B选择的提交,这意味着&#34;分支A上的所有提交 branch B,不包括两个分支上的任何提交。&#34;这就是git cherry执行其第一部分的方式:它查找对称差异的提交。但是,git cherry继续抛出所有提交&#34;同样的&#34; 1 分支,然后标记-一侧和+另一侧的分支。 --left-right选项会将所有提交标记为<(左侧)或>(右侧)。

由于rev-list是Swiss Army Chainsaw命令,因此 还能够抛出相同的提交。它具有更多的能力:它可以完全抛弃提交,相同或不同。在这种情况下,这就是我们想要的东西:抛弃&#34;提交相同的#34; (这样我们只保留&#34;不同的&#34;)然后扔掉所有&#34;左边&#34;提交(这样我们只保留右侧而不是左侧的那些)。我们用--cherry-pick得到前者:它只保留被认为是&#34;不同的提交&#34;。然后我们添加--right-only以仅保留右侧的那些,即,当我们说firstbranch...secondbranch时,只保留secondbranch中不同的。 ..这正是git cherry的作用。

因此:

git rev-list --right-only --cherry-pick firstbranch...secondbranch

生成相同的提交ID列表:

git cherry firstbranch secondbranch

(唯一的区别是代替+ face0ff...,它会打印+face0ff,即+标记后没有空格。

这看起来很愚蠢:我们需要git cherry和一堆选项以及两个分支名称和三个句点,而不仅仅是四个单词git rev-list和两个分支名称。我们输入了更多的字母来获得相同的东西。所以我们可以使用较短的命令并将其传递给git log,但现在我们得到了棘手的一点。

git loggit rev-list几乎是相同的命令

事实上,它们是使用相同的源代码构建的,它们只是以不同的方式设置了一些内部选项(如果您没有为任何其他起点命名,git log会假装您说HEAD )。由于我们要将git rev-list的输出管道传输到git log --pretty='%h %ce',我们可以直接在git log中完成整个事情。

果然,我们可以。我们需要与git rev-list相同的所有选项,但现在我们可以运行:

git log --cherry-pick --right-only --pretty='%h %ce' firstbranch...secondbranch

(您可能还需要--no-merges - 我还不确定git cherry关于合并的内容!)。

1 &#34; Sameness&#34;,在这种情况下,由git patch-id的输出决定,它基本上剥离了识别线条数字的差异(并且还剥离了某些白色)空间细节)。因此,如果一个提交被挑选到另一个分支中,则这两个提交通常都具有相同的补丁ID。 (如果有人必须解决合并冲突,则补丁ID会有所不同。)