[英]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 的方法,但存在各种缺点:
首先制作两个文件列表:“所有标记提交”和“所有提交可从主提交”:
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
。
与之前的想法相同,但使用uniq -d
生成列表。 这确实需要排序,但可以消除使用管道的临时文件:
(git rev-list --tags --no-walk; git rev-list master) | sort | uniq -d
缺点:需要排序。 提交以某种奇怪的顺序出现,而不是您通常使用git log
看到的顺序。
编写您自己的实用程序,该实用程序基本上可以执行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.