我曾经git tag --force移动标签,现在我想在移动之前知道标签在哪里。
我在手册页和网站Pro Git § 2.6 Git Basics - Tagging 中都没有找到任何内容。
之前似乎没有人发布过这个问题。
确定知道的唯一方法是事先在标签上保留标签(标签?)。
正如评论中所指出的,有两种标签:“注释”和“轻量级”。
在这两种情况下,对于名为 的标签T,git 创建一个名为 的引用。对于轻量级标签,此名称直接指向某个提交。对于带注释的标签,git 首先在存储库中创建一个“带注释的标签”对象(这与提交、树或 blob 的存储方式相同),然后具有引用名称——否则它只是一个“轻量级” tag”——指向带注释的标签对象。带注释的标签对象然后指向链中的下一个链接,通常是提交对象。refs/tags/T
更新引用时,git 检查logs目录(通常是.git/logs)以查看是否有与 ref-name 相对应的文件。如果你偷看,.git/logs你会看到一个HEAD名为refs. 在 之下refs,有一个名为 的目录heads,在refs/heads每个分支之下都有一个文件。例如,该refs/heads/master文件包含 branch 的引用日志master。
默认情况下,没有.git/logs/refs/tags目录,因此没有标签文件,因此没有标签更新的 reflog。这是因为标签不打算移动。它们应该是永久性的;这是标记名称和分支名称之间不同的主要属性:分支提示移动,标记不移动。
但是,如果您打算移动一个标签,然后想知道它曾经在哪里,您可以在其中创建.git/logs/refs/tags并制作一个包含标签名称的文件。完成后,标签更新将写入一个引用日志条目。显然,这只有在您提前计划时才有帮助。
还有另一种直接的方法来恢复“标签曾经指向的位置”:找到标签 SHA-1 值的旧记录。这就是 reflog 会做的事情,但如果你没有,也许你有一个存储库的克隆,也许那个克隆有旧标签。或者,您可能很幸运,并且有一个窗口,例如,在回滚中仍显示 SHA-1。
如果标记是带注释的标记,您可以使用git fsck. 这通常会产生大量输出。“悬空 blob”在活动存储库中是很正常的,当您提交git add某些内容然后git add提交不同的版本时,它们就会发生。
当提交被放弃并且它们的 reflog 条目过期时,就会发生“悬空提交”。这里要寻找的是“悬垂标签”:
dangling tag 20e14672ee2253d38c1001179d8f17688d47059c
Run Code Online (Sandbox Code Playgroud)
这将是带注释的标签对象的 SHA-1;你可以附加一个新的引用(比如一个新的轻量级标签,或者重新强制旧的或其他)以确保它不会被git gc-ed和删除。