Go 编程语言有一个关于使用 mq 进行代码审查的页面,它指出:“由于在应用 mq 补丁时拉取、推送、更新和提交可能会损坏您的存储库”。
我明白为什么推送或更新可能是一个问题,但拉一个问题?
如果您应用了 mq 补丁并且您拉动了您的存储库会被损坏吗?
Go 编程语言有一个关于使用 mq 进行代码审查的页面,它指出:“由于在应用 mq 补丁时拉取、推送、更新和提交可能会损坏您的存储库”。
我明白为什么推送或更新可能是一个问题,但拉一个问题?
如果您应用了 mq 补丁并且您拉动了您的存储库会被损坏吗?
如果您应用了 mq 补丁并且您拉动了您的存储库会被损坏吗?
答案是否定的。当您拉动时,您会在本地历史记录中添加更多变更集。应用的 MQ 补丁也作为变更集存在于变更集图表中,但这并不危险,您也不会丢失任何数据。
可能发生的情况是您应用了一些补丁:
.... a --- b --- p1 --- p2 --- p3
然后,您将补丁发送到上游邮件列表以供包含。有人审查补丁,提交它们,并将变更集推送到主存储库。其他变更集随后被推送,下次你拉你最终得到:
.... a --- b --- p1 --- p2 --- p3 --- c --- d
更改集仍然是存储库中的 MQ 补丁,但它们现在有p1
非MQ子代!尝试弹出它们会导致(使用 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 可能最终会自行删除这些行——但这种情况很少发生,所以还没有人编写那个补丁。
如果您在存储库中应用了 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 页面建议的挂钩提供了很好的保障。
请注意,您也可以始终在上游变更集之上重新定位您的补丁。有关如何执行此操作的说明,请参阅此页面。