为什么我的干净的 Git 仓库副本上 "git describe" 显示一个旧的标签版本?

10

一些背景:

我目前有两个本地的git仓库指向同一个origin/master项目。我有两个git仓库是为了有一个干净的主要副本,可以随时使用,另一个是我用来进行更改、提交等操作的沙盒。这可能有些过度,但对我个人来说有一些优点,因为我有一个重复的本地git副本。

一位同事最初创建了一个1.0.2的轻量级标签,但我们删除了它,并重新打上了同样编号的注释版本标签。他通过git push将更改提交到远程存储库。我在我的两个本地git实例上拉取了最新的更改。

我们的标签如下:

release-1.0.0
release-1.0.1
release-1.0.2

问题:

这是我无法解决的问题。当我运行“git describe”时,我的沙盒存储库显示最新的标签版本(release-1.0.2)。这正是我所期望的。然而,我只从中拉取代码的干净存储库副本在执行“git describe”时显示较旧的标签(release-1.0.1)。我验证了两者都指向原始主分支。我进行了更多的研究,并找到了一个overstack solution,指导我运行“git cat-file -t”。以下是我注意到的差异:

git cat-file -t release-1.0.1 --> tag 
git cat-file -t release-1.0.2 --> commit

当我在干净的代码库上运行“git describe”时,为什么会显示一个较旧的标签版本,而我的沙盒库却不会?如果我在干净的库副本上运行“git describe --tags”,我可以确认看到列出了release-1.0.2。
1个回答

11

一位同事最初创建了一个轻量级标签1.0.2,但我们将其删除并重新以相同编号的注释版本进行了标记。他们通过git push将更改提交到远程库。我在我的两个本地git实例上下载了最新的更改。

除非使用--tags标志,否则git describe仅涉及注释标签(而不是轻量级标签)。在这里,git cat-file的输出表明您的sandbox repo仍然具有旧的release-1.0.2轻量级标签。问题是,默认情况下,git pull本身不会获取同名的新的注释标签并用它覆盖旧的轻量级标签。

为了解决这个问题,首先运行以下命令在本地删除轻量级标签:

git tag -d release-1.0.2

在您的沙盒存储库中,然后运行

git fetch

(或者 git pull,如果您知道您在做什么)。然后,新的 release-1.0.2 注释标签将取代旧的轻量级标签。您可以通过运行 git describe 来确保这一点。

git cat-file -t release-1.0.2

现在应该输出tag(而不是commit)。


这可能解释了为什么我的干净的repo显示一个较旧的标签,但并没有解释为什么当我运行“git describe”时,我的沙盒repo会显示最新的(轻量级)标签。 我注意到在我的eclipse git视图中,旧标签显示为注释标签(小黄色人物图标),而新标签显示为轻量级标签参见“轻量级和签名标签”。 我的同事最初为1.0.2创建了一个轻量级标签,但我们将其删除并重新打上了相同编号的注释版本。 这可能会搞乱事情吗? - lifesabeach
@lifesabeach 我的同事最初为1.0.2创建了一个轻量级标签,但我们将其删除并重新打上了相同编号的注释版本。这可能会出现问题吗? 是的。一切都表明您仍然在沙盒存储库中拥有旧的轻量级标签release-1.0.2。问题在于,默认情况下,git pull本身不会获取新的注释标签并用其覆盖旧的轻量级标签。尝试使用git tag -d release-1.0.2在本地删除标签,然后运行git pull。然后使用git describe检查情况。 - jub0bs
顺便说一下,你的评论(https://dev59.com/To7ea4cB1Zd3GeqPBXNr#3pcToYgBc1ULPQZFyHRR)包含回答你问题所需的有用信息。为了完整起见,你应该编辑你的问题,并将这些信息添加到那里。那么你的问题(以及对它的回答)更有可能帮助未来的访问者。 - jub0bs
1
谢谢@Jubobs。那个方法有效!我已经根据你的原始回答对我的问题进行了相应的更新。 - lifesabeach
@lifesabeach 很好。我已经相应地编辑了我的答案。 - jub0bs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接