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获取提交者电子邮件?
答案 0 :(得分:2)
这样的事情:
git cherry firstbranch secondbranch | awk '$0=$2' | git log --no-walk --stdin --pretty='%h %ce'
- 不走路:只显示给定的提交,但不要遍历他们的祖先
%h:缩写提交哈希
%ce:提交者电子邮件
答案 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
选择的提交,这意味着"分支A
上的所有提交或 branch B
,不包括两个分支上的任何提交。"这就是git cherry
执行其第一部分的方式:它查找对称差异的提交。但是,git cherry
继续抛出所有提交"同样的" 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 log
和git 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会有所不同。)