一个`git log`标记的提交方式如何?

时间:2014-02-05 05:35:34

标签: git

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

4 个答案:

答案 0 :(得分:7)

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

git log --no-walk --tags

--no-walk阻止此操作开始使用标记并查找所有父提交以及父母的父级,依此类推。)

但是您要求“主分支上的标记提交”,我假设这意味着(在技术术语中)“通过master可以通过标记指向的提交科”。这实际上更难(git rev-list可以通过--stdin --no-walk设置联合,但似乎没有办法设置交集)。以下是找到正确的commit-ID的几种方法,但有各种缺点:

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

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

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

    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创建临时文件的脚本,以创建唯一名称)。

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

  4. 在所有情况下,一旦你有了commit-ID列表,你只需要将它们传递给git log --no-walk,例如:

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

答案 1 :(得分:2)

可能有很多方法可以解决这个问题,但我认为这会做你想做的事情:

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

答案 2 :(得分:1)

另一种选择,但也是如此:

git tag | xargs git show --quiet

答案 3 :(得分:0)

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