7

一些背景:

我目前有两个本地 git 存储库,它们指向同一个源/主项目。我有两个 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)。这是我所期望的。但是,当我执行“”时,我只从中提取的干净的 repo 副本显示较旧的标签(release-1.0.1)git describe。我确认两者都指向原始主机。我做了更多的研究,发现了一个overstack 解决方案,它指向我运行“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如果我在干净的 repo 副本上运行“”,我可以确认我可以看到列出的 release-1.0.2 。

4

1 回答 1

9

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

除非您使用--tags标志,否则git describe只关心带注释的(而不是轻量级的)标签。在这里, 的输出git cat-file表明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)。

于 2015-08-25T17:02:36.047 回答