如何用最近的标签装饰git日志?

时间:2013-06-29 10:04:08

标签: git

git log --decorate将有关相关引用的信息添加到日志输出中:

commit 9e895ace5d82df8929b16f58e9f515f6d54ab82d (tag: v3.10-rc7)
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Sat Jun 22 09:47:31 2013 -1000

    Linux 3.10-rc7

此信息有助于跟踪哪个标记(或分支)包含此提交。查看受限制的文件集(例如,子目录)时,不必为这些提交标记。有没有办法在日志输出中添加对标记的引用?

我之前提到过git describe,但这会产生v3.10-rc7-135-g98b6ed0,它相对于提交此更改的分支标记。我要找的是提交之间的标签名称。

为清楚起见,这是目前的情况:

$ git log --decorate --oneline
98b6ed0 (HEAD, origin/master, master) Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
1a506e4 Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
578a131 dlci: validate the net device in dlci_del()
11eb264 dlci: acquire rtnl_lock before calling __dev_get_by_name()
...
9e895ac (tag: v3.10-rc7) Linux 3.10-rc7

我想拥有的是:

98b6ed0 (v3.10-rc7+, HEAD, origin/master, master) Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
1a506e4 (v3.10-rc7+) Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
578a131 (v3.10-rc7+) dlci: validate the net device in dlci_del()
11eb264 (v3.10-rc7+) dlci: acquire rtnl_lock before calling __dev_get_by_name()
...
9e895ac (tag: v3.10-rc7) Linux 3.10-rc7

使用git describe的输出而不是提交哈希将显示如下内容:

$ git log --decorate --oneline -n4 | awk '{system("git describe " $1 " |tr -d '\''\n'\''");$1="";print}'
v3.10-rc7-135-g98b6ed0 (HEAD, origin/master, master) Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
v3.10-rc7-54-g1a506e4 Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
v3.10-rc6-81-g578a131 dlci: validate the net device in dlci_del()
v3.10-rc6-80-g11eb264 dlci: acquire rtnl_lock before calling __dev_get_by_name()
...
v3.10-rc7 (tag: v3.10-rc7) Linux 3.10-rc7

如您所见,较旧的标记名称用作参考点,而不是提交合并的点。出于插图的目的,我在这里使用git log --oneline,但我实际上想要使用更全面的输出,例如git log -p --stat

2 个答案:

答案 0 :(得分:5)

--first-parent的{​​{1}}参数(随git 1.8.4引入)显示了派生的提交的位置。要查看提交第一个标记的关系,请使用git describe。当你深入研究历史时,这个选项变得非常慢(约6秒)。自git 1.5.3起可用。

命令git describe --contains可用于注释git name-rev并起作用 还有git rev-name--graph!从其手册页:

  

给定提交,找出它相对于本地引用的位置。说某个人   写了关于那个梦幻般的提交   33db5f4d9027a10e477ccf054b2c1ab94f74c85a。当然,你看看提交,   但这只会告诉你发生了什么,而不是上下文。

     

输入--color

git name-rev
     

现在你更明智了,因为你知道它在v0.99之前发生了940次修改。

     

你能做的另一件好事是:

% git name-rev 33db5f4d9027a10e477ccf054b2c1ab94f74c85a
33db5f4d9027a10e477ccf054b2c1ab94f74c85a tags/v0.99~940

这最后一个命令会为每个40个字符的SHA-1哈希添加一些内容,如下所示(突出显示的部分由% git log | git name-rev --stdin 添加)。

commit 1ee2dcc2245340cf4ac94b99c4d00efbeba61824 (tags/v3.13-rc1~33)
Merge: 4457e6f 091e066
Author: Linus Torvalds

    Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

commit b4089d6d8e71a7293e2192025dfa507a04f661c4 (tags/v3.13-rc1~7^2~6^2^2~8)
Author: Felix Fietkau

    rt2x00: fix a crash bug in the HT descriptor handling fix
...
commit dfb6b7c109a7f98d324a759599d1b4616f02c79f (tags/v3.12-rc7~20^2~20^2^2~11)
Author: Stanislaw Gruszka
Date:   Mon Sep 23 04:08:13 2013 +0200

    Revert "rt2x00pci: Use PCI MSIs whenever possible"

    This reverts commit 9483f40d8d01918b399b4e24d0c1111db0afffeb (tags/v3.11-rc1~16^2~103^2^2~111).

https://git.lekensteyn.nl/scripts/tree/git-log-describe.awk提供了用于后期处理git name-rev输出的awk脚本 (在我知道git log之前写的)。特性:

  • 考虑来自git rev-name的散列而不是40个字符的散列(也适用于commit <hash>)。
  • 支持--abbrev-commit格式。
  • 添加git log --graphgit describe --contains输出。
  • 可以指定缓存目录以便以后节省时间。

答案 1 :(得分:2)

  

如您所见,较旧的标记名称用作参考点,而不是提交合并的位置。

这应该是可能的......很快(git 1.8.4 July 2013):

请参阅commit e00dd1e9485c50f202cc97dfae19d510e108b565

describe: Add --first-parent option
  

在执行提交历史记录时,只考虑第一个父提交   如果您只希望在合并后匹配分支上的标记,这将非常有用。


OP Lekensteyn评论它(--first-parent)是不够的:

  

--first-parent也没有显示合并的标签   我刚刚发现可以使用--contains   有关更好的解决方案my answer,请参见git name-rev

注意:git name-rev的日期可以追溯到git0.99.9 (Oct. 2005!)