Git 重新标记理智和疯狂的建议 - 第 2 部分



当我读到git标签的重命名时,很多人指出阅读:

当您标记错误的提交并且您想要 重新标记?

如果您从未推出任何内容,只需重新标记即可。使用"-f"替换 旧的。大功告成。

但是如果你把东西推了出来(或者其他人可以读你的 直接存储库),那么其他人将已经看到了旧标签。 在这种情况下,您可以执行以下两项操作之一:

理智的事情。只要承认你搞砸了,并使用不同的名称。 其他人已经看到一个标签名称,如果您保持相同的名称, 您可能处于两个人都有"版本 X"的情况,但是 他们实际上有不同的"X"。所以只需称它为"X.1"即可完成 有了它。

疯狂的事情。你真的也想称新版本为"X", 即使其他人已经看到了旧的。所以只需使用 git 标签 -f 再次,就好像您还没有发布旧的一样。

但是,Git 不会(也不应该)更改用户背后的标签 返回。因此,如果有人已经获得了旧标签,请在您的 git 拉取上 树不应该只是让它们覆盖旧的树。

如果有人从您那里获得了发布标签,您不能只更改标签 通过更新您自己的来为他们服务。这是一个很大的安全问题,在 人们必须能够信任他们的标签名称。如果你真的想要 要做疯狂的事情,你需要承认它,并告诉 你搞砸的人。

好吧,关于重新标记,如果您有兴趣,我问了一个较早的问题 - Git 重新标记理智和疯狂的建议 - 第 1 部分,但是,这不是必需的。我刚刚将问题链起来,因为上下文是相同的。

所以,我的问题是

我有一个远程的 2 个本地存储库 - 存储库 1 和存储库 2。

第 1 步:在 repo1 中创建带注释的标签,名称包括X

第 2 步:推送到远程。

第 3 步:存储库 2 拉取标签。

步骤 4:存储库 1 删除标记 X 并创建另一个标记X但这次带有不同的消息。

第 5 步:推送到远程。

第 6 步:在 repo2 中,git pull --tags更新标记 X。

这怎么可能? 如上所述,git 不应该这样做 - 这是更新标签?

因此,如果有人已经获得了旧标签,

这是您的第 3 步。

不应该只是让他们覆盖旧的。

好吧,它没有,因为它仍然持有旧标签,不是吗?

如果有人从您那里获得了发布标签,您不能只更改标签 通过更新您自己的来为他们服务。

所以旧的是有效的 - 一切都很好。推送标签后无法更改标签。

如果您的repo2以某种方式配置为从远程修剪标签,则可以这样做。例如,在~/.gitconfig或其他地方可能有fetch.pruneTags=true。如果你想弄清楚它,git config -l | grep fetch运行,看看它会打印什么。

修剪标签不是默认设置,因此不建议对此进行中继。您可以在受控存储库上使用它,但不要期望其他开发人员已启用prune-tags

详细信息在文档中:

由于保持远程分支和标签的最新状态是一种常见用例,因此可以与 --prune 一起提供 --prune 选项,以修剪远程上不存在的本地标签,并强制更新那些不同的标签。标签修剪也可以通过fetch.pruneTags或远程启用。配置中的修剪标签。请参阅 git-config。

--prune-tags 选项等效于在远程的 refspecs 中声明 refs/tags/:refs/tags/。这可能会导致一些看似奇怪的交互:

最新更新