首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何知道Git标签是否已被移动?

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

Stack Overflow用户
提问于 2014-08-07 17:47:18
回答 1查看 808关注 0票数 7

我使用git tag --force来移动一个标签,现在我想知道在移动它之前标签在哪里。

我没有在手册页上找到任何东西,也没有在亲Git§2.6 Git基础-标记网站上找到任何东西。

以前似乎没有人发过这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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使用不同的版本,它们就会发生。

“悬空提交”发生在提交被放弃且其重发条目过期时。这里需要寻找的是一个“悬空的标签”:

代码语言:javascript
复制
dangling tag 20e14672ee2253d38c1001179d8f17688d47059c

这将是带注释的标记对象的SHA-1;您可以附加一个新的引用(例如新的轻量级标记,或者重新强制旧的引用或其他任何东西),以确保它不会得到git gc-ed并删除。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25188920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档