8

Go 编程语言有一个关于使用 mq 进行代码审查的页面,它指出:“由于在应用 mq 补丁时拉取、推送、更新和提交可能会损坏您的存储库”。

我明白为什么推送或更新可能是一个问题,但拉一个问题?

如果您应用了 mq 补丁并且您拉动了您的存储库会被损坏吗?

4

2 回答 2

6

如果您应用了 mq 补丁并且您拉动了您的存储库会被损坏吗?

答案是否定的。当您拉动时,您会在本地历史记录中添加更多变更集。应用的 MQ 补丁也作为变更集存在于变更集图表中,但这并不危险,您也不会丢失任何数据。

可能发生的情况是您应用了一些补丁:

.... a --- b --- p1 --- p2 --- p3

然后,您将补丁发送到上游邮件列表以供包含。有人审查补丁,提交它们,并将变更集推送到主存储库。其他变更集随后被推送,下次你拉你最终得到:

.... a --- b --- p1 --- p2 --- p3 --- c --- d

更改集仍然是存储库中的 MQ 补丁,但它们现在有p1MQ子代!尝试弹出它们会导致(使用 Mercurial 2.1.1):p3

$ hg qpop
abort: popping would remove a revision not managed by this patch queue

这有点死锁。这很烦人,但并不危险。p1要解决它,您必须让MQ 了解p3不再由 MQ 管理。您可以通过从.hg/patches/status. 当这种情况发生时,MQ 可能最终会自行删除这些行——但这种情况很少发生,所以还没有人编写那个补丁。

于 2012-03-12T16:07:50.053 回答
5

如果您在存储库中应用了 MQ 补丁时不小心与上游变更集合并,这肯定是一个问题。这是我刚刚尝试过的一个似乎存在问题的场景:

  • 假设在您的克隆中,您使用hg qpush -a
  • 然后你从上游提取变更集hg pull(但不要hg update)。这将创建一个新分支(hg heads显示您所在的分支qtip和您刚刚拉取的新分支tip
  • 当你正在破解时,你决定切换到新分支并运行hg update -C tip,但这样做不会弹出你的补丁。
  • 当您再砍掉一些时,您决定将分支与hg merge. 哎呀!您刚刚合并到一个从未有过的 MQ 补丁中qfinished

由于 MQ 通过创建和销毁历史来工作,因此补丁变更集看起来就像历史的正常部分。但是,由于您“跨越”了已应用的补丁并将它们与补丁变更集合并,因此您不能再弹出补丁。实际上,运行hg qpop将中止并显示一条消息:

abort: popping would remove a revision not managed by this patch queue

当我使用补丁队列时,我通常只是尽量小心并意识到拉或推,但是 go 页面建议的挂钩提供了很好的保障。

请注意,您也可以始终在上游变更集之上重新定位您的补丁。有关如何执行此操作的说明,请参阅此页面。

于 2011-03-02T01:05:08.410 回答