我想要在主分支上查看所有标签提交记录的git日志(而不包括未标记的提交记录)。这个有可能吗?
这个秘诀就是意识到 git log
使用与 git rev-list
相同的规则。后者命令有一个 --tags
标志以查看标签。因此,与迄今为止的其他答案一样,如果你愿意查看所有已标记的提交,则可以使用此单个命令:
git log --no-walk --tags
(--no-walk
参数可以防止从标签开始搜索所有父提交,它们的父提交等等。)
但是你要求查找“主分支上的已打标签提交”,我理解为(以技术术语),“既被标签指向又可通过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
--oneline
选项正是我所寻找的。谢谢 - Wesley Gonçalvesgit 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)'
--tags
,但没有与--no-walk
结合使用。简单的命令实际上已经让我完成了95%的工作(虽然我很感激你的详细回答)。 - davidchambers