我想要git log
master分支上的所有带标记的提交(无标记的提交都没有)。这可能吗?
解决这个问题的秘诀是认识到git log
使用与相同的规则git rev-list
。后一个命令有一个--tags
标记来查看标记。因此,与到目前为止的其他答案一样,如果您愿意查看所有带标记的提交,则可以使用以下单个命令:
git log --no-walk --tags
(这样--no-walk
可以防止从标签开始,并找到他们所有的父提交,以及父母的父母,等等。)
但是您要求“在master分支上标记的提交”,我认为(用技术术语来说)意味着“既由标记指向的提交又可以通过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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句