我想git log
主分支上的所有标记提交(并且没有任何未标记的提交)。这可能吗?
答案 0 :(得分:7)
这方面的秘诀是要意识到git log
使用与git rev-list
相同的规则。后一个命令有一个--tags
标志来查看标签。因此,与目前为止的其他答案一样,如果您愿意查看所有标记的提交,则此单个命令将执行此操作:
git log --no-walk --tags
(--no-walk
阻止此操作开始使用标记并查找所有父提交以及父母的父级,依此类推。)
但是您要求“主分支上的标记提交”,我假设这意味着(在技术术语中)“通过master
可以通过标记和指向的提交科”。这实际上更难(git rev-list
可以通过--stdin --no-walk
设置联合,但似乎没有办法设置交集)。以下是找到正确的commit-ID的几种方法,但有各种缺点:
首先制作两个文件列表:“所有标记的提交”和“所有可从主设备访问的提交”:
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
。
与以前相同,但使用uniq -d
生成列表。这真的 需要排序,但您可以使用管道删除临时文件:
(git rev-list --tags --no-walk; git rev-list master) | sort | uniq -d
缺点:需要排序。提交以某种奇怪的顺序出现,而不是通常用git log
看到的顺序。
编写自己的实用程序,基本上执行comm
方法将执行的操作,但调用git rev-list
本身(可能是使用mktemp
创建临时文件的脚本,以创建唯一名称)。
缺点:需要做更多的工作。 : - )
在所有情况下,一旦你有了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)'