В Mercurial Безопасно ли тянуть при применении патча mq? - PullRequest
8 голосов
/ 02 марта 2011

В языке программирования go есть страница с обзорами кода , использующая mq, и она гласит: «Поскольку извлечение, нажатие, обновление и фиксация при применении патчей mq могут повредить ваш репозиторий».

Я понимаю, почему добавление или обновление может быть проблемой, но вызывает ли это проблему?

Если у вас есть mq-патчи, и вы потянете, будет ли поврежден ваш репозиторий?

Ответы [ 2 ]

6 голосов
/ 12 марта 2012

Если у вас есть mq-патчи, и вы потянете, будет ли поврежден ваш репозиторий?

Ответ нет . Когда вы тянете, вы добавляете больше наборов изменений в свою локальную историю. Примененные патчи MQ также используются в виде набора изменений на графике набора изменений, но это не опасно, и вы не потеряете данные.

То, что может произойти, это то, что вы применили несколько патчей:

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

Затем вы отправляете исправления в вышестоящий список рассылки для включения. Кто-то просматривает исправления, фиксирует их и отправляет наборы изменений в главный репозиторий. Другие изменения вступают в силу позже, и в следующий раз, когда вы потянете, вы получите:

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

Наборы изменений p1 до p3 все еще являются исправлениями MQ в вашем хранилище, но теперь у них есть non-MQ дочерних элементов! Попытка выскочить их приводит к (с Mercurial 2.1.1):

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

Это что-то вроде тупика. Это раздражает, но не опасно. Чтобы решить эту проблему, вы должны заставить MQ понять, что p1 - p3 больше не управляются MQ. Вы делаете это, удаляя строки для этих наборов изменений из .hg/patches/status. MQ, вероятно, должен в конечном итоге удалить эти строки самостоятельно, когда это произойдет, но это случается довольно редко, поэтому никто еще не написал этот патч.

5 голосов
/ 02 марта 2011

Конечно, это может быть проблемой, если вы случайно слились с вышестоящими наборами изменений, когда у вас есть исправления MQ, примененные в вашем хранилище.Вот сценарий, который я только что опробовал, который, кажется, имеет проблемы:

  • предположим, что в вашем клоне вы нажимаете все свои патчи с помощью hg qpush -a
  • , затем вы извлекаете наборы изменений из апстрима с помощьюhg pull (но не hg update).это создает новую ветку (hg heads показывает ветку, в которой вы находитесь, qtip, а новую ветку, которую вы только что перетянули, как tip)
  • , когда вы взламываете, вы решаете переключитьсяв новую ветку и запустите hg update -C tip, но сделайте это без не выдавая свои патчи.
  • по мере того, как вы взломаете еще немного, вы решите объединить ветви с hg merge.К сожалению!Вы только что слились в патч MQ, который никогда не был qfinished.

Поскольку MQ работает, создавая и уничтожая историю, наборы изменений патча выглядят как обычные части истории.Однако, поскольку вы «перепрыгнули» через примененные патчи и объединили их с набором изменений non -patch, вы больше не сможете удалять патчи.На самом деле, выполнение hg qpop будет прервано с сообщением:

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

Обычно я просто стараюсь быть осторожным и осознавать, что нужно тянуть или толкать, когда я работаю с очередью патчей, но подсказки предполагаютна странице перехода обеспечьте хорошую защиту.

Обратите внимание, что вы всегда можете также перебазировать свои патчи поверх вышестоящих наборов изменений.См. эту страницу для описания того, как это сделать.

...