Создание и использование Mercurial Patch - PullRequest
13 голосов
/ 27 декабря 2010

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

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

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

Ответы [ 7 ]

23 голосов
/ 14 декабря 2011

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

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

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

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

8 голосов
/ 27 декабря 2010

При стандартной установке 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 имеют идентичное содержимое, но репозитории не связаны друг с другом из-за удаления и повторной инициализации папки .hg.

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

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
3 голосов
/ 27 декабря 2010

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

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

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

Как только это будет сделано, передайте изменения и нажмите, если необходимо.

2 голосов
/ 27 декабря 2010

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

$ 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 / patches / series.

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

$ hg clone http://location.of.new/repo ./new_repo

репо init patch

$ 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
0 голосов
/ 27 декабря 2010

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

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

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

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

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

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

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

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

0 голосов
/ 27 декабря 2010

Попробуйте заглянуть в плагин MQ, он делает именно это, если я не забуду. Я никогда не пользовался этим, поэтому не могу сказать.

0 голосов
/ 27 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...