【问题标题】:How to show full history of tags in git?如何在 git 中显示标签的完整历史记录?
【发布时间】:2016-09-30 01:49:55
【问题描述】:

git 中的标签显然可以从一个提交移动到另一个提交,只需删除它们然后重新标记。

例如:

git tag -m "Version 1.0" v1.0 abcd123
git push --tags
git tag -d v1.0
git tag -m "Corrected version 1.0" v1.0 1234abc
git push --tags

如何查看特定标签的全部历史记录? (换句话说,任何时候创建/删除具有该名称的标签,以及每个标签指向的提交)

如何查看所有标签的全部历史记录?

【问题讨论】:

    标签: git version-control tags


    【解决方案1】:

    它们也可以被强制移动:

    git tag -f ...
    

    然后强推。

    如何查看特定标签的全部历史记录? (换句话说,任何时候创建/删除一个比名称的标签,以及每个指向的提交)

    一般来说,你不能。

    如果标签被强制移动和强制推送,并且您保留标签的引用日志,您可以从标签的引用日志中检索以前的值,直到这些引用日志条目过期。但是,删除引用(任何引用)会删除 reflog。

    带注释的标签使用存储库中的对象(除了引用本身)。删除引用删除对带注释标签对象的外部标签名引用。只要底层对象本身没有被移除,就可以通过 ID 访问它。但是,作为未引用的对象,它受制于通常的垃圾收集规则。只有当一些额外的引用(通常是另一个注释标记的另一个标记名)保持原始注释标记对象可访问时,它才能保证保留在存储库中。

    (没有根本原因树对象不能指向标记对象,因此有可能有一个提交对象指向保留旧注释标记的树。但是 Git 不是为此而构建的,并且没有构建这些东西的工具,git fsck 可能会认为它们是错误的。所以这更像是一个理论练习:理论上可以通过特殊的方法保存并保留“旧标签”和“标签历史”如果至少编写了一个 Git 管道命令和几个脚本,则可能通过新的引用名称空间(例如 refs/tagarchive/)指向提交。当然,在有人编写这些之前,这都是纯粹的猜测。目前尚不清楚它们会如何有用。)

    【讨论】:

    • 这是一个很好的答案,但我不确定如何应用它;我对 git 的一些内部结构还不够熟悉。 “只要底层对象本身没有被移除,就可以通过ID访问”——如何列出未引用的对象?我如何分辨其中哪些是标签?如何判断每个标签是哪个特定标签?
    • “也不清楚它们有什么用处”——这对我来说似乎很有价值;标签通常用于标记发布。就像在修订历史中不留下记录就不可能更改代码(嗯,有点-我知道强制推动更改),应该不可能在不留下记录的情况下更改标签,可能也在修订历史中。如果这个功能真的不存在,那么我会开始使用提交消息而不是(或除了)标签来标记发布,因为没有记录它们更难修改。
    • git fsck (kernel.org/pub/software/scm/git/docs/git-fsck.html) 可以找到未引用的对象,包括标签。另见stackoverflow.com/q/36621730/1256452。至于有用性:您永远不会应该更改或删除标签。这就是标签的意义所在。请参阅 kernel.org/pub/software/scm/git/docs/… 了解 Linus Torvald 对此的看法。
    • @torek,没错。除非活动克隆的数量少于少数,否则更新标签是个麻烦事。我认为这是一个更好的框架访问控制问题。换句话说,如果人们在没有适当考虑的情况下更新标签,则应该使用pre-receive 钩子拒绝修改和删除标签。
    • @torek 不应该,大声笑但是如果有人这样做呢?垃圾回收后甚至不会有任何记录
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2020-12-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    相关资源
    最近更新 更多