Добавление изменений из одного хранилища Mercurial в другое - PullRequest
8 голосов
/ 21 апреля 2010

Когда я менял 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 ]

11 голосов
/ 21 апреля 2010

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

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

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

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

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

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

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

0 голосов
/ 21 апреля 2010

Вы можете получить изменения из несвязанного репозитория с помощью "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"

сделать репозиторий b

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"
...