Создание и использование патча Mercurial
я столкнулся с проблемой, которую я "думаю", можно решить только с помощью патчей.
я клонировал проект из нашего основного репозитория, внес в него немало изменений (обновления, удаление файлов и каталогов и дополнений). Эти изменения даже не зафиксированы. Проблема в том, что проект из основного репозитория был удален/удален и воссоздан как новый проект (имя такое же, все структуры каталогов такие же, как и раньше). Я снова клонировал этот проект из основной репозиторий и хотел бы перенести в него все мои незафиксированные изменения.
Я все еще исследуя hg patch
чтобы решить эту проблему. Было бы полезно, если бы кто-то мог подтвердить, что создание и добавление патча-правильный подход к этому, любые ресурсы, объясняющие процесс, будут очень полезны.
7 ответов
Я бы сначала сделал копии всего, чтобы у вас был способ отследить.
затем, в рабочей копии с изменениями, я бы сначала удалил .hg
каталог, затем скопируйте в .hg
каталог из нового РЕПО. Это в основном переносит все измененные файлы в новое репо без необходимости удаления каких-либо файлов и каталогов.
вам все равно нужно будет сообщить РЕПО о том, следует ли удалять файлы, помеченные как отсутствующие. Вам также придется обрабатывать переименования вручную. Если это небольшое количество операций, это проще, чем пытаться использовать метод Patch.
после этого Сохранить изменения и нажать, если надо.
вы правы-патч-это то, что вам нужно для передачи информации из одного репозитория в другой (несвязанный) репозиторий. Это будет работать, так как файлы одинаковы, как вы заметили.
Итак, чтобы перенести незафиксированные изменения из вашего old
клон, ты
$ hg diff -g > uncommited.patch
$ cd ../new
$ hg patch --no-commit ../old/uncomitted.patch
это восстановит информацию, сохраненную в патче. Сюда входят сведения о файлах, добавленных или переименованных в старом клоне.
следующие шаги могут быть выполнены со стандартной установкой Mercurial:
- зафиксировать изменения в локальном репозитории. Обратите внимание на номер редакции.
- используйте " HG export-R REV >patch.diff " для создания патча.
- клонировать новый репозиторий.
- используйте " 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/ потому что это объясняет (косвенно) кое-что из этого.