如何仅用`git log`查看标签提交记录?

18

我想要在主分支上查看所有标签提交记录的git日志(而不包括未标记的提交记录)。这个有可能吗?

4个回答

23

这个秘诀就是意识到 git log 使用与 git rev-list 相同的规则。后者命令有一个 --tags 标志以查看标签。因此,与迄今为止的其他答案一样,如果你愿意查看所有已标记的提交,则可以使用此单个命令:

git log --no-walk --tags

(--no-walk参数可以防止从标签开始搜索所有父提交,它们的父提交等等。)

但是你要求查找“主分支上的已打标签提交”,我理解为(以技术术语),“既被标签指向又可通过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生成列表。这确实需要排序,但可以使用管道消除临时文件:

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

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

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

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

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

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

很棒的答案!我确实尝试过 --tags,但没有与 --no-walk 结合使用。简单的命令实际上已经让我完成了95%的工作(虽然我很感激你的详细回答)。 - davidchambers

2
也许有很多方法可以解决这个问题,但我认为以下方法可以满足您的需求:

可能有许多方法可以实现这一点,但我认为以下方法可以达到您的要求:

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

2
一个类似的替代方案如下:
git tag | xargs git show --quiet

使用 --oneline 选项正是我所寻找的。谢谢 - Wesley Gonçalves

2
自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)'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接