我使用git tag --force来移动一个标签,现在我想知道在移动它之前标签在哪里。
我没有在手册页上找到任何东西,也没有在亲Git§2.6 Git基础-标记网站上找到任何东西。
以前似乎没有人发过这个问题。
发布于 2014-08-07 18:51:58
唯一能确定的方法就是保留标签(标签?)手边的标签上。
正如注释中所指出的,有两种标签:“注释”和“轻量级”。
在这两种情况下,对于一个名为T的标记,git都会创建一个名为refs/tags/T的引用。对于轻量级标记,此名称直接指向某些提交。对于带注释的标记,git首先在存储库中创建一个“带注释的标记”对象(存储方式与提交、树或blob相同),然后具有引用名称--否则,它只是对带注释的标记对象的“轻量级标记”-point。然后,带注释的标记对象指向链中的下一个链接,通常是一个提交对象。
更新引用时,git将检查logs目录(通常是.git/logs),以查看是否有与参考名称相对应的可用文件。如果您查看.git/logs,您将看到一个名为HEAD的文件和一个名为refs的目录。在refs下面,有一个名为heads的目录,在refs/heads下,每个分支都有一个文件。例如,refs/heads/master文件包含分支master的重触发器。
默认情况下,不存在.git/logs/refs/tags目录,因此没有标记的文件,因此没有标记更新的重触发器。这是因为标签不打算移动。它们应该是永久的;这是标签名和分支名称不同的主要属性:分支提示移动,标签不移动。
但是,如果您打算移动一个标记,然后想知道它过去在哪里,您可以创建.git/logs/refs/tags,然后在其中创建一个包含标记名的文件。一旦您这样做了,标记更新将编写一个reflog条目。显然,这只有在你事先计划好的情况下才有帮助。
还有另一种直接恢复“标记指向的位置”的方法:查找标记的SHA-1值的旧记录。这就是reflog所能做的,但是如果你没有一个,也许你有一个库的克隆,也许那个克隆有旧的标签。或者,您可能会很幸运,并且有一个窗口,其中SHA-1仍然显示在滚动回来,例如。
如果标记是带注释的标记,则可以使用git fsck搜索存储库中不再具有引用的带注释的标记对象。这通常会产生大量的产出。“悬空点”在活动存储库中是非常正常的,当您在提交之前先git add一些东西,然后git add使用不同的版本,它们就会发生。
“悬空提交”发生在提交被放弃且其重发条目过期时。这里需要寻找的是一个“悬空的标签”:
dangling tag 20e14672ee2253d38c1001179d8f17688d47059c这将是带注释的标记对象的SHA-1;您可以附加一个新的引用(例如新的轻量级标记,或者重新强制旧的引用或其他任何东西),以确保它不会得到git gc-ed并删除。
https://stackoverflow.com/questions/25188920
复制相似问题