2

我想用来git cherry显示所有提交到特定分支但从主分支中丢失的提交,并使用漂亮的格式记录下来。

我试过这个:

git cherry master branch_name | grep "^+" | sed 's/^+ //' | xargs -I {} git --no-pager log --pretty=format:'%h,%an,%d,%ae,%ad,%s' --date=short -1 {}

这样做是为了:

  1. git cherry master branch_name- 在终端中逐行列出所有在 branch_name 中而不在 master 中具有代码的提交的哈希值,反之则在哈希值之前使用 + 或 - 号。

  2. grep "^+"- 只获取以 + 开头的那些(实际上从 branch_name 中缺少的那些)

  3. sed 's/^+ //'-+从行中删除,以便我们只能获得哈希。

  4. xargs -I {} git --no-pager log --pretty=format:'%h,%an,%d,%ae,%ad,%s' --date=short -1 {}- 将每个哈希作为参数传递给 git log 以显示每个哈希的格式化日志。这里--no-pager的意思是退出 git log 窗口并-1只显示 1 次提交。

这样做的问题在于,它开始将 git cherry 返回的每个散列的每个结果连接在同一行。它不会逐行执行,因此我可以复制粘贴它们,也可以使用 .csv 文件将它们保存到 csv 文件中... > tmp.csv

不确定是否还有其他我可以使用的东西,xargs或者这实际上是 git log 的问题,这不起作用。

我错过了什么?我做错了什么?

谢谢大家,很抱歉成为菜鸟。

4

1 回答 1

3

你用过--pretty=format:...。请注意,也有 a --pretty=tformat:...并且它是默认值

提交格式

--pretty[=<format>], --format=<format>

       以给定的格式漂亮地打印提交日志的内容......当 <format> 是 [不是预定义的格式,如短、中、单行等] 并且其中包含 %placeholder 时,它就像--pretty=tformat:<format>给定的一样。

...

       该tformat:格式的工作原理与 . 完全相同format:,只是它提供了“终止符”语义而不是“分隔符”语义。换句话说,每个提交都附加了消息终止符(通常是换行符),而不是在条目之间放置分隔符。这意味着单行格式的最终​​条目将正确地以新行终止...

因此,该--pretty=tformat:...形式可以缩写为--format=...

简化:--no-walksed技巧

除此之外,还有一种更好(更有效)的方法可以达到预期的效果。您仍然可以git cherry像以前一样使用,并使用sed剥离标记,就像以前一样。你可以省略grepsincesed也可以做到这一点:使用sed -nand s/pattern/replacement/p。而且,既然您已经选择了正确的提交,那么您可以将它们全部作为一个git log命令的参数提供,并使用--no-walk查看git log提供的哈希,而不查看它们的任何祖先。

也就是说,而不是:

git cherry master branch_name | grep "^+" | sed 's/^+ //' | xargs -I {} \
    git --no-pager log --format='%h,%an,%d,%ae,%ad,%s' --date=short -1 {}

你可以这样做:

git log --no-walk --format='%h,%an,%d,%ae,%ad,%s' --date=short \
    $(git cherry master branch_name | sed -n 's/^+ //p')

(你现在--no-pager也可以省略,就像我一样,因为它足够安全,可以让寻呼机运行)。

但其实都是内置的

如果git log与 本质上不是相同的命令git rev-list,这将是要走的路——但实际上,git loggit rev-list采用所有相同的提交选择参数。此外,主要只是, 1git cherry的前端,因此有一种更有效的方法可以做到这一点:git rev-list

git log --right-only --cherry-pick --format="$format" master...branch

$format您想要的格式在哪里。(我认为- 仅获取左/右,cherry-pick/cherry-mark 参数正确有点棘手;这是基于对手册页的快速扫描和对您的问题的草率阅读。)


1git cherry与参数一起使用时<limit>,我不确定您是否可以从 获得相同的结果git rev-list,但^<limit>可能会起作用。

于 2016-08-18T19:12:00.400 回答