Создание и использование патча Mercurial

я столкнулся с проблемой, которую я "думаю", можно решить только с помощью патчей.

я клонировал проект из нашего основного репозитория, внес в него немало изменений (обновления, удаление файлов и каталогов и дополнений). Эти изменения даже не зафиксированы. Проблема в том, что проект из основного репозитория был удален/удален и воссоздан как новый проект (имя такое же, все структуры каталогов такие же, как и раньше). Я снова клонировал этот проект из основной репозиторий и хотел бы перенести в него все мои незафиксированные изменения.

Я все еще исследуя hg patch чтобы решить эту проблему. Было бы полезно, если бы кто-то мог подтвердить, что создание и добавление патча-правильный подход к этому, любые ресурсы, объясняющие процесс, будут очень полезны.

7 ответов


Я бы сначала сделал копии всего, чтобы у вас был способ отследить.

затем, в рабочей копии с изменениями, я бы сначала удалил .hg каталог, затем скопируйте в .hg каталог из нового РЕПО. Это в основном переносит все измененные файлы в новое репо без необходимости удаления каких-либо файлов и каталогов.

вам все равно нужно будет сообщить РЕПО о том, следует ли удалять файлы, помеченные как отсутствующие. Вам также придется обрабатывать переименования вручную. Если это небольшое количество операций, это проще, чем пытаться использовать метод Patch.

после этого Сохранить изменения и нажать, если надо.


вы правы-патч-это то, что вам нужно для передачи информации из одного репозитория в другой (несвязанный) репозиторий. Это будет работать, так как файлы одинаковы, как вы заметили.

Итак, чтобы перенести незафиксированные изменения из вашего old клон, ты

$ hg diff -g > uncommited.patch
$ cd ../new
$ hg patch --no-commit ../old/uncomitted.patch

это восстановит информацию, сохраненную в патче. Сюда входят сведения о файлах, добавленных или переименованных в старом клоне.


следующие шаги могут быть выполнены со стандартной установкой Mercurial:

  1. зафиксировать изменения в локальном репозитории. Обратите внимание на номер редакции.
  2. используйте " HG export-R REV >patch.diff " для создания патча.
  3. клонировать новый репозиторий.
  4. используйте " HG import patch.diff", чтобы применить патч к новому репозиторию.

пример

C:\>hg init example
C:\>cd example
C:\example>echo >file1
C:\example>hg ci -Am file1
adding file1

C:\example>hg clone . ..\example2
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

C:\example>rd /s/q .hg
C:\example>hg init
C:\example>hg ci -Am same-but-different
adding file1

в этот момент example и example2 имеют одинаковые содержимое, но репозитории не связаны друг с другом из-за удаления и повторной инициализации .папка НД.

теперь внесите некоторые изменения и зафиксируйте их в одном из репозиториев, затем экспортируйте их как патч:

C:\example>echo >>file1
C:\example>echo >file2
C:\example>hg ci -Am changes
adding file2

C:\example>hg export -r 1 >patch.diff

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

C:\example>cd ..\example2
C:\example2>hg pull
pulling from c:\example
searching for changes
abort: repository is unrelated

C:\example2>hg import ..\example\patch.diff
applying ..\example\patch.diff

похоже, что вам нужны очереди исправлений. В том, что у вас есть незафиксированные изменения, и вы хотите вытянуть из нового РЕПО, прежде чем совершать их....

$ hg qinit -c # initialize mq for your repo containing the uncommitted changes 
$ hg qnew name_of_patch # create patch that contains your uncommitted changes
$ hg qpop # resets your working dir back to the parent changeset

не беспокойтесь, хотя ваши изменения в целости и сохранности.hg / patches / name_of_patch, чтобы увидеть сами.....

$ cat .hg/patches/name_of_patch

теперь потяните новое РЕПО

$ hg pull -u http://location.of.new/repo # pull in changes from new repo update working dir

$ hg qpush # apply your uncommitted changes to new repo

Если Вам повезет, у вас не будет конфликтов слияния, и вы можете продолжить и зафиксировать патч....

$ hg qfinish -a # change all applied patches to changeset

а потом, если хотите....

$ hg push http://location.of.new/repo

если РЕПО не связаны, просто введите патч-РЕПО в новое РЕПО. и вручную скопируйте патч и добавьте его .файл HG/патчи/серия.

патч предполагая. клонировать новое РЕПО
$ hg clone http://location.of.new/repo ./new_repo

init patch repo

$ cd ./new_repo && hg qinit -c

скопировать патч

$ cp ../old_repo/.hg/patches/name_of_patch .hg/patches/

редактировать файл серии с помощью какого-то редактора

$ your_favorite_editor .hg/patches/series

name_of_patch   # <---put this in the series file

применить патч к новым РЕПО

$ hg qpush

если нет конфликтов слияния, и вы убеждены, он работает

$ hg qfinish -a

если макет одинаков, вы можете просто скопировать все файлы (исключая .рт. ст.), а затем использовать hg addrem.


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


Если старый репозиторий был просто перемещен / клонирован на новый URL-адрес, вы можете просто изменить удаленный репозиторий, который вы говорите с новым.

Если, однако, он был воссоздан с нуля (даже с той же структурой), то я не считаю, что Mercurial имеет встроенную функциональность, чтобы помочь вам здесь. Mercurial patches ссылается на определенные наборы изменений, которые не будут существовать в Вашем новом репозитории.

вы можете использовать инструмент слияния для выполнения diff и принести через любой изменения, которые ты внес.

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

Mercurial отслеживает изменения по наборам изменений в репозитории, а не на уровне файлов, например Subversion.

Если вы клон, то вы можете легко перенести/объединить в другой репозиторий, который также был клонирован из того же источника.

Если вы воссоздали репозиторий, то идентификаторы изменений не будут совпадать и не могут быть объединены в Hg. Единственный вариант в этом сценарии - использовать инструмент слияния, который позволит вам увидеть несоответствия в структуре файлов/папок.

также: стоит отметить http://hginit.com/ потому что это объясняет (косвенно) кое-что из этого.