如何知道Git标签是否已被移动?

我使用git tag –force移动标签,现在我想知道移动它之前标签的位置.

我没有在手册页或Pro Git § 2.6 Git Basics – Tagging网站上找到任何内容.

之前似乎没有人发布过这个问题.

最佳答案 唯一可以确定的方法是事先在标签上保留标签(标签?).

正如评论中所指出的,有两种标签:“注释”和“轻量级”.

在这两种情况下,对于名为T的标记,git会创建名为refs / tags / T的引用.对于轻量级标记,此名称直接指向某个提交.对于带注释的标记,git首先在存储库中创建一个“带注释的标记”对象(它以与提交,树或blob相同的方式存储),然后具有引用名称 – 否则它将只是“轻量级”标记“-point到带注释的标记对象.然后,带注释的标记对象指向链中的下一个链接,通常是提交对象.

更新引用时,git会检查logs目录(通常是.git / logs),以查看是否有与ref-name对应的文件.如果你查看.git / logs,你会看到一个名为HEAD的文件和一个名为refs的目录.在refs下面,有一个名为heads的目录,在refs / heads下面,每个分支都有一个文件.例如,refs / heads / master文件包含分支主机的reflog.

默认情况下,没有.git / logs / refs / tags目录,因此标签没有文件,因此标签更新没有reflog.这是因为标签不打算移动.它们应该是永久性的;这是标签名称和分支名称之间不同的主要属性:分支提示移动,标签不移动.

但是,如果您打算移动标记,然后想知道它曾经在哪里,您可以创建.git / logs / tags,然后在其中创建一个包含标记名称的文件.完成后,标记更新将写入reflog条目.显然,如果您事先做好计划,这只会有所帮助.

还有另一种直接的方法来恢复“标记用于指向的位置”:查找标记的SHA-1值的旧记录.这就是reflog会做的事情,但如果你没有,可能你有一个克隆的存储库,也许那个克隆有旧的标签.或者你可能会很幸运,并且有一个窗口,例如,在回滚中仍然显示SHA-1.

如果标记是带注释的标记,则可以使用git fsck在存储库中搜索不再具有引用的带注释标记对象.这通常会产生很多输出. “悬空blob”在活动存储库中非常正常,它们会在你添加一些内容然后git在提交之前添加不同版本时发生.
当提交被放弃并且其reflog条目到期时,会发生“悬空提交”.这里要寻找的是“悬挂标签”:

dangling tag 20e14672ee2253d38c1001179d8f17688d47059c

这将是带注释的标签对象的SHA-1;你可以附加一个新的引用(例如一个新的轻量级标记,或重新强制旧的或其他),以确保它不会被git gc-ed和删除.

点赞