0

使用 Maven 发布插件时,我遇到了 git 标签的问题。我们已经关闭了期间自动推送到 gitmvn release:perform的功能,为了构建一个新版本,我们做了以下工作:

  1. 从远程 git 存储库中提取最新更改。
  2. mvn release:prepare
  3. mvn release:perform
  4. git push origin master
  5. git push --tags

这个场景有效,提交被标记并且一切都很好。但是,在这种情况下,标签会丢失:

  1. 从远程 git 存储库中提取最新更改。
  2. mvn release:prepare
  3. 有人向主人推了一个承诺!
  4. mvn release:perform
  5. git push origin master-- 不起作用,因为有新的提交,所以
  6. git pull --rebase origin master
  7. git push origin master
  8. git push --tags

Git 声明已经推送了新标签,但是除了我(构建构建的人)之外的任何人都无法使用它们,使用 时它们也不可见gitk,因此在所有实际使用中,标签都丢失了。

这是 git 中的错误,还是使用错误(确保构建时没有提交是我们的责任)?

4

3 回答 3

3

正如其他人已经说过的那样,问题在于标签不会在变基后自动更新为指向新的提交 ID。

避免这种情况的一种简单方法是仅使用merge而不是rebase。然后您的提交将不会被修改,并且标签仍然指向正确的提交。

对于您的间接问题:其他人没有“看到”旧标签的原因是,Git 默认情况下仅在可从已获取的提交中访问标签(例如,在已获取的分支上)时才获取标签。要获取所有标签,请使用以下命令:

git fetch --tags

这将获得标签,但它们仍将指向旧的(在变基之前)提交。

于 2013-03-11T16:13:18.347 回答
1

这是一个使用错误。标签是指特定的提交,由其 SHA1 哈希标识。当您键入

git pull --rebase origin master

您正在重写历史记录,以便您的本地更改建立在远程master分支的新状态上。您标记的提交不再出现在此历史记录中,尽管通过使用gitk --all您应该能够看到它们仍然存在于本地存储库的替代历史记录中。

master拥有一个直接用于标记发布以及对来自多个开发人员的推送提交开放的分支可能是一个错误。您可以改为为每个版本创建一个新分支,就像在这个工作流中一样。

于 2013-03-11T12:46:07.350 回答
1

正如在另一个答案中所说的那样,rebase 正在搞乱历史,因此标签不再是它们应该在的位置。

现在,我可以通过以下方式获取我的标签:

删除本地 git 标签: git tag -d nameoftag

删除远程 git 标签(我已经推送):git push origin :refs/tags/nameoftag

创建一个新标签,现在在正确的位置:git tag nameoftag HEAD(HEAD 可以代替 sha-id)

最后,推送标签:git push --tags

现在其他人可以享受缺少的标签,但对于未来,我想我只会发送一封我正在为发布而构建的电子邮件,警告任何推动东西的人会产生可怕的后果。

于 2013-03-11T15:27:22.273 回答