繁体   English   中英

一个 `git log` 如何只标记提交?

[英]How does one `git log` tagged commits only?

我想在 master 分支上git log所有标记的提交(并且没有任何未标记的提交)。 这可能吗?

对此的秘密技巧是意识到git log使用与git rev-list相同的规则。 后一个命令有一个--tags标志来查看标签。 因此,与迄今为止的其他答案一样,如果您愿意查看所有标记的提交,则此单个命令将执行此操作:

git log --no-walk --tags

--no-walk阻止从标签开始并查找所有父提交和父提交等。)

但是您要求“在 master 分支上标记提交”,我认为这意味着(在技术术语中)“由标记指向可通过master分支访问的提交”。 这要困难得多( git rev-list可以通过--stdin --no-walk设置并集,但似乎无法设置交集)。 以下是几种找到正确提交 ID 的方法,但存在各种缺点:

  1. 首先制作两个文件列表:“所有标记提交”和“所有提交可从主提交”:

     git rev-list --tags --no-walk > /tmp/all-tags git rev-list master > /tmp/all-master

    现在只打印只出现在两个文件中的行。 comm实用程序可以做到这一点。 它记录在案,希望对文件进行排序,但在我见过的所有实现中,文件只需要按相同的顺序排列,就像这样,因此无需预先排序即可工作:

     comm -12 /tmp/all-tags /tmp/all-master

    缺点:需要两个临时文件(除非你使用特殊的bash语法/dev/fd ); 没有排序可能无法工作; 需要comm

  2. 与之前的想法相同,但使用uniq -d生成列表。 确实需要排序,但可以消除使用管道的临时文件:

     (git rev-list --tags --no-walk; git rev-list master) | sort | uniq -d

    缺点:需要排序。 提交以某种奇怪的顺序出现,而不是您通常使用git log看到的顺序。

  3. 编写您自己的实用程序,该实用程序基本上可以执行comm方法的功能,但会调用git rev-list本身(可能是一个使用mktemp创建临时文件以生成唯一名称的脚本)。

    缺点:需要做更多的工作。 :-)

在所有情况下,一旦您拥有提交 ID 列表,您只需将它们传递给git log --no-walk ,例如:

git log --no-walk $(comm -12 /tmp/all-tags /tmp/all-master)

可能有很多方法可以解决此问题,但我认为这里有一种方法可以满足您的需求:

git tag | 
xargs -iCID git --no-pager log -1  CID

另一种选择,但遵循相同的思路:

git tag | xargs git show --quiet

自 2014 年以来,Git 发生了很多事情; 现代用户可能会发现此命令对此很有用:

git log --simplify-by-decoration --tags --pretty='tformat:%C(auto)%h %as%d %s'

如果您想包含其他装饰(如分支),只需删除--tags

git log --simplify-by-decoration --pretty='tformat:%C(auto)%h %as%d %s'

或者,您可能会发现这很有用:

git tag -l --format='%(tag) %(taggerdate:short) %(objectname:short) %(subject)'

暂无
暂无

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

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