2013-03-11 105 views
0

我在使用maven发行版插件时遇到了git标签的问题。在mvn release:perform我们已经关闭了自动推到git的,下面做是为了建立一个新的版本:git中丢失的标签

  1. 拉从远程混帐回购协议的最新变化。
  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时也不可见,因此在所有实际应用中,t他的标签丢失了。

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

回答

1

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

git pull --rebase origin master 

你正在重写历史,这样你的本地修改建立在远程master分支的新状态。您标记的提交不再存在于此历史记录中,但通过使用gitk --all,您应该能够看到它们仍存在于本地存储库中的备用历史记录中。

master分支直接用于标记发布以及为来自多个开发人员的推送提交打开可能是错误的。您可以改为为每个版本创建一个新分支,如this workflow

+0

有没有什么办法可以避免这种情况发生:一旦有人在发布阶段推送了一个提交到主服务器?或者正在向所有人发送电子邮件,警告他们不要推动任何事情来做到这一点? – Tobb 2013-03-11 14:13:34

+0

根据我编辑的答案,我建议不要使用主分支来标记发布,至少如果有几个人可以推送它。我不使用Maven,所以不能真正说出如何在当前的计划中解决此问题。您可以在本地删除标签,并在重新绑定后重新运行Maven命令? – Ben 2013-03-11 14:27:35

0

正如在另一个答案中所说的那样,rebase正在搞砸了历史,所以标签不再是它们应该存在的地方。

现在,我能够做的,让我的标签:

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

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

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

最后推标签:git push --tags

现在,其他人可以享受失踪的标签,但对未来而言,我认为我只会发送一封我正在发布的电子邮件,警告任何人推动东西的可怕后果。

3

正如其他人已经指出的那样,问题是标签不会自动更新,以指向rebase之后的新提交ID。

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

对于你的间接问题:别人不会“看见”旧标签的原因是因为Git默认只从已提取的提交(例如,在已提取的分支上)可访问的标签中提取标签。为了让所有的标签使用以下命令:

git fetch --tags 

这将让标签,但他们仍将指向旧的(重订之前)提交。