Добавление изменений из одного хранилища Mercurial в другое

Когда я менял VCS для моего проекта FakeItEasy с SVN на Mercurial в Google Code, я был слишком взволнован (мне так смешно). То, что я сделал, просто проверил последнюю версию из SVN и затем отправил эту проверку в качестве первой ревизии нового репозитория Mercurial. Это очевидно имеет эффект, что вся история потеряна.

Позже, когда я немного привык к Mercurial, я понял, что существует такая вещь, как "расширение для конвертации", которое позволяет вам конвертировать SVN-репо в Mercurial. Теперь я хочу преобразовать старый репозиторий SVN, а затем импортировать в этот конвертированный репозиторий все наборы изменений из существующего репозитория Mercurial, кроме самого первого коммита в Mercurial.

Я конвертировал репозиторий SVN в локальный репозиторий Mercurial, но теперь я застрял. Я думал, что смогу использовать расширение convert, чтобы перенести текущий репозиторий Mercurial в конвертированный и с картой сплайса удалить первый коммит, но я не могу заставить это работать.

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

Чтобы сделать это более понятным, скажем, у меня есть эти два хранилища:

A: revA1-revA2
B: revB1-revB2-revB3 (Where revB1 is actually a copy of revA2)

Теперь я хочу объединить эти два в новый репозиторий, содержащий это:

C: revA1-revA2-revB2-revB3

2 ответа

Решение

Пока вы меняете хэши в новых ревизиях (вы есть), вы можете просто использовать export а также import (или transplant команда, которая является оберткой вокруг двух).

Вы уже сделали свое преобразование, и это здорово, теперь перейдите в репозиторий B и выполните:

hg export -o 'changeset-%R.patch' 1:tip

это создаст набор изменений -##.patch для каждого набора изменений в репо B, кроме первого (с нулями).

Теперь перейдите в репозиторий C и импортируйте их:

hg import $(ls *.patch | sort -V)

Это все должно применяться чисто, если действительно revA2 и revB1 были идентичны.

Вы можете получить изменения из несвязанного репозитория с помощью "hg pull --force"

Вот простой пример использования:

настроить тестовые каталоги

C:\temp>mkdir hgtest
C:\temp>cd hgtest
C:\temp\hgtest>mkdir a
C:\temp\hgtest>mkdir b
C:\temp\hgtest>mkdir c

сделать хранилище

C:\temp\hgtest>cd a
C:\temp\hgtest\a>hg init
C:\temp\hgtest\a>echo line one >> file.txt
C:\temp\hgtest\a>hg add file.txt
C:\temp\hgtest\a>hg ci -m "check in one"
C:\temp\hgtest\a>echo line two >> file.txt
C:\temp\hgtest\a>hg ci -m "check in two"
C:\temp\hgtest\a>echo line three >> file.txt
C:\temp\hgtest\a>hg ci -m "check in three"

сделать хранилище б

C:\temp\hgtest\a>cd ..\b
C:\temp\hgtest\b>copy ..\a\file.txt file.txt
C:\temp\hgtest\b>hg init
C:\temp\hgtest\b>hg add file.txt
C:\temp\hgtest\b>hg ci -m "check in b one"
C:\temp\hgtest\b>echo line four >> file.txt
C:\temp\hgtest\b>hg ci -m "check in b two"
C:\temp\hgtest\b>echo line five >> file.txt
C:\temp\hgtest\b>hg ci -m "check in b three"

сделайте репозиторий c как сначала клон a, затем внесите изменения из b

C:\temp\hgtest\b>cd ..\c
C:\temp\hgtest\c>hg clone C:\temp\hgtest\a .
C:\temp\hgtest\c>hg pull --force C:\temp\hgtest\b
C:\temp\hgtest\c>hg merge
C:\temp\hgtest\c>hg ci -m "check in c one"
Другие вопросы по тегам