2011-03-01 61 views

回答

5

如果您在存儲庫中應用了MQ修補程序時意外地與上游更改集合並,那肯定會有問題。這裏有一個場景我只是想出去,這似乎表現出的問題:

  • 假設在你的克隆,你把你所有的補丁與hg qpush -a
  • 然後你拉的變更從上游hg pull(但不要hg update) 。這將創建一個新的分支(hg heads顯示了作爲qtip你的分支和新的分支,你只是拉爲tip
  • 爲你黑客攻擊的時候,你決定要切換到新的分支,並運行hg update -C tip,但這樣做沒有彈出您的修補程序。
  • 隨着你破解一些,你決定合併分支hg merge。哎呀!你只是合併在一個從未有過qfinished的MQ補丁中。

由於MQ通過創建和銷燬歷史記錄來工作,因此修補程序更改集看起來像歷史的正常部分。但是,由於您對所應用的修補程序「跨越了」,並將其與非修補程序更改集合合在一起,因此無法再將修補程序彈出。事實上,運行hg qpop將中止報說:

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

我一般只是儘量小心和有意識的約拉或當我有一個補丁隊列工作推動,但掛鉤由go頁面上提示提供一個很好的保障。

請注意,您始終可以在上游變更集之上重新綁定您的修補程序。請參閱this page瞭解如何做到這一點的說明。

+0

也許我在說明中遺漏了一些東西,但在您描述的場景中拉並不是問題。我明白拉讓你有一個新的分支,但你可以這樣開始。我想我的問題是尋找更多的布爾答案,而不是一個場景;-)我會試着澄清我的問題。 – 2011-03-02 03:18:20

+0

我認爲你是正確的,拉不一定是問題。事實上,在我描述的情況下,如果您在切換分支之前先拉動qpop,那麼您應該完全沒有問題。即使你拉,然後嘗試合併而不切換到新的分支,MQ似乎也足夠聰明,以防止你這樣做(至少在我測試的hg 1.6上)。 我的猜測是Go團隊推薦hook來防止像我所描述的情況,這可能會破壞您的修補程序隊列並最終導致回購歷史記錄。 – bjlaub 2011-03-02 12:01:01

+4

這將在Mercurial 1.8.1中修復 - 我只是推了一個補丁:http://hg.intevation.org/mercurial/crew/rev/9510ddf87c43 – 2011-03-02 13:24:43

6

如果你有mq補丁應用,你拉將你的存儲庫被損壞?

答案是no。拉動時,您可以將更多變更集添加到您的本地歷史記錄中。應用的MQ補丁也作爲變更集存在變更集圖中,但這並不危險,您不會丟失任何數據。

什麼可以發生的是,你已經申請了一些補丁:

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

你然後發送補丁上游郵件列表列入。有人檢查補丁,提交它們,並將變更集推送到主存儲庫。其他的變更都推後和明年你拉時你結束了:

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

變更p1p3仍然在你的倉庫MQ補丁,但他們現在有非MQ兒!試圖彈出它們的結果(與Mercurial 2.1.1):

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

這是一個死鎖。這很煩人,但並不危險。要解決它,您必須讓MQ瞭解p1p3不再由MQ管理。您可以通過從.hg/patches/status中刪除這些更改集的行來完成此操作。當這種情況發生時,MQ最終可能會自行刪除這些行 - 但這種情況很少發生,因此沒有人編寫該修補程序。

+0

+1用於告訴如何解決它 – batman 2013-03-29 12:07:10