Добавление изменений из одного хранилища 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"