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

一个`git log`如何只标记提交?,git,Git,我想git logmaster分支上所有标记的提交(以及所有未标记的提交)。这可能吗?可能有很多方法可以做到这一点,但我认为有一种方法可以满足您的需求: git tag | xargs -iCID git --no-pager log -1 CID 另一种选择,但思路相同: git tag | xargs git show --quiet 实现这一点的秘诀是认识到git log使用与git rev list相同的规则。后一个命令具有查看标记的--tags标志。因此,与到目前为止的其他答案

我想
git log
master分支上所有标记的提交(以及所有未标记的提交)。这可能吗?

可能有很多方法可以做到这一点,但我认为有一种方法可以满足您的需求:

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

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

git tag | xargs git show --quiet

实现这一点的秘诀是认识到
git log
使用与
git rev list
相同的规则。后一个命令具有查看标记的
--tags
标志。因此,与到目前为止的其他答案一样,如果您愿意查看所有标记的提交,这个命令就可以:

git log --no-walk --tags
--no walk
阻止从标记开始查找所有的父提交,以及父提交的父提交,等等。)

但是您要求“在主分支上进行标记的提交”,我假定这意味着(在技术术语中)“由标记指向并且可以通过
主分支
访问的提交”。这要困难得多(
git rev list
可以通过
--stdin--no walk
进行集合并集,但似乎无法进行集合交叉)。以下是几种查找正确提交ID的方法,但有各种缺点:

  • 首先创建两个文件列表:“所有标记的提交”和“所有可从主服务器访问的提交”:

    现在只打印两个文件中出现的行。政府可以做到这一点。文件中记载了期望对文件进行排序,但在我所看到的所有实现中,文件只需按相同的顺序排列即可,因此无需预先排序:

    comm -12 /tmp/all-tags /tmp/all-master
    
    缺点:需要两个临时文件(除非您使用使用使用
    /dev/fd
    的特殊
    bash
    语法);没有分类可能无法工作;需要
    通信

  • 与之前的想法相同,但使用
    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)
    

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

    git log --simplify-by-decoration --tags --pretty='tformat:%C(auto)%h %as%d %s'
    
    如果您想包括其他装饰(如分支),只需删除
    --标记即可:

    git log --simplify-by-decoration --pretty='tformat:%C(auto)%h %as%d %s'
    
    或者,您可能会发现这很有用:

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

    回答得好!我确实尝试了
    --标记
    ,但没有与
    --禁止行走
    结合使用。这个简单的命令实际上让我获得了95%的成功(尽管我很欣赏你的答案的彻底性)。将它与
    --oneline
    选项一起使用是我一直在寻找的。Thks
    git tag -l --format='%(tag) %(taggerdate:short) %(objectname:short) %(subject)'