我需要一些方法来列出我的系统中所有标签的日期,他们被创建,但不确定我是否可以通过 git-log 获得这些数据。有什么想法吗?
按照标记创建日期排序适用于带注释的轻量级标记:
git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags
要根据提交日期对带注释的标记和轻量级标记进行排序,我使用:
git for-each-ref --format='%(*committerdate:raw)%(committerdate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \ sort -n | awk '{ print $4, $3; }'
这个命令将按照时间顺序列出每个标记和相关的提交对象 id。
git log --tags --simplify-by-decoration --pretty="format:%ci %d"
也很好的输出(没有日期字段) :
git log --tags --decorate --simplify-by-decoration --oneline
要查看具有依赖关系和条带线性提交的完整历史记录(只查看基本事件,如标记和分支/合并) :
git log --graph --decorate --simplify-by-decoration --oneline --all
Git 2.8(2016年3月)记录了另一个选项 可以追溯到 git 1.4.4(2006年10月)。 见 提交 e-914ef0(2016年1月5日) by 黄志光(ele828)。 (由 朱尼奥 · C · 哈马诺 gitster于2016年1月20日在 提交108cb77合并)
ele828
gitster
看看新的 Documentation/git-for-each-ref.txt
Documentation/git-for-each-ref.txt
对于提交和标记对象,特殊的 creatordate和 creator 字段将对应于适当的日期或姓名-电子邮件-日期元组 根据对象类型从 committer或 tagger字段。 它们用于处理带注释的标记和轻量级标记 的混合。
creatordate
creator
committer
tagger
因此,使用 creatordate可以处理标记:
git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(refname) %(*objectname) %(objectname)' refs/tags | \ sort -n | awk '{ print $4, $3; }'
或者:
git tag --sort=-creatordate
正如我在“ 如何按照 rc-X.Y.Z.W 格式的版本字符串顺序对 git 标记进行排序?”中详述的那样,您可以向 git tag添加排序顺序(从 Git 2.0 June 2014开始)。
git tag
这种排序顺序包括 字段名(在 git for-each-ref中列出)Taggerdate。这允许 git tag --sort=taggerdate(由 DarVar下面提到) 例如,在 git/git回购中,它将最后列出 v2.10.0标记:
git for-each-ref
git tag --sort=taggerdate
git/git
v2.10.0
v2.9.1 v2.9.2 v2.9.3 v2.10.0-rc0 v2.10.0-rc1 v2.10.0-rc2 v2.10.0
默认指令不会(git tag) :
v2.1.2 v2.1.3 v2.1.4 v2.10.0 v2.10.0-rc0 v2.10.0-rc1 v2.10.0-rc2 v2.2.0
用 Git version 2.10.0.windows.1
version 2.10.0.windows.1
git tag --sort=-taggerdate
根据手册页,“ Prefix-按值的降序排序。”
git tag 使用与 git-for-each-ref相同的排序键,git-for-each-ref记录了这些键。
git-for-each-ref
这个一行程序显示日期和标签:
git tag --format='%(creatordate:short)%09%(refname:strip=2)'
产出:
2015-09-27 v0.1.0 2019-10-22 v0.10.0 2020-07-08 v0.12.0 2015-11-18 v0.2.0 2020-12-08 v1.0.0
默认情况下,标签按字典顺序排序。如果您喜欢按日期排序:
git tag --format='%(creatordate:short)%09%(refname:strip=2)' --sort=creatordate
2015-09-27 v0.1.0 2015-11-18 v0.2.0 2019-10-22 v0.10.0 2020-07-08 v0.12.0 2020-12-08 v1.0.0
有关详细信息,请参阅 回答。
在前面提到的方法的基础上,我还希望看到列表中的实际标记日期,因此我使用的版本是:
git for-each-ref --format='%(*creatordate:raw)%(creatordate:raw) %(creatordate:short) %(refname) %(*objectname) %(objectname)' refs/tags | sort -n | awk '{ print $3, $5, $4 }'
以下内容依赖于提交,所以它是否包含提交的日期信息并不重要:
git log --tags --decorate --simplify-by-decoration|grep ^commit|grep tag|sed -e 's/^.*: //' -e 's/)$//' -e 's/,.*$//'|tac
上面 Josh Lee 给出的答案依赖于标签日期来获得正确的顺序。
注意: 我的 git --version是 git version 2.25.1。
git --version
git version 2.25.1
对于所有标记的列表 -l,每个标记(-n99)的消息字段中最多有99行,按照时间顺序和最新的标记 最后,执行以下操作:
-l
-n99
git tag -l -n99 --sort=taggerdate
(我喜欢的形式)来颠倒时间顺序,把最新的标签 第一,在 taggerdate前面加上一个减号(-) ,像这样:
taggerdate
-
git tag -l -n99 --sort=-taggerdate
更进一步:
要在标签中搜索,并且只显示名称中包含字符串 my string的标签,请在末尾添加 '*my string*'。注意,星号(*)是搜索模式中的通配符:
my string
'*my string*'
*
git tag -l -n99 --sort=-taggerdate '*my string*'
要只显示标记名称,并且不显示最多99行的标记消息,只需删除 -n99部分:
git tag -l --sort=-taggerdate '*my string*'