Как перейти с Subversion на Mercurial, когда структура ствола / ветви / тега - беспорядок? - PullRequest
7 голосов
/ 20 января 2010

Я бы хотел преобразовать хранилище из Subversion в Mercurial, но когда я изначально настроил хранилище, я сделал это самым ленивым способом.Со временем структура продолжала трансформироваться и разрушаться (ей уже 5 лет).Тем не менее, я хотел бы сохранить как можно больше истории, даже если мне придется испачкаться и вручную сшить вещи.

Без лишних слов текущая структура выглядит так:

svn://svn.example.com/Example
    + trunk
        + BigProject
        + BinaryDepedencies
    + branches
        + BigProject
            + branch1
            + feature1
            + maintenance1
            + ...
    + tags
        + BigProject
            + tag1
            + tag2
            + ...
    + projects
        + small_project1
        + small_project2
        + small_project3
        + ...

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

Кроме того, по разным причинам я не смогу использовать git, если нет пуленепробиваемой стратегиипреобразовать этот конкретный репозиторий из Subversion в git в hg / bzr.

Ответы [ 2 ]

7 голосов
/ 20 января 2010

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

Другим инструментом в вашем арсенале может быть преобразование hg-> hg и расширение rebase. Вы можете использовать их, чтобы возиться с вашим деревом после того, как у вас есть вещи в репозитории hg и привить ветки после того, как вы их преобразовали. Или вживите новые кусочки своей истории в сундук после его перемещения.

Вот хорошая ссылка на документацию по расширению Mercurial rebase .

По сути, вот стратегия, которой вы бы следовали ... Во-первых, используйте конвертируемое расширение или hgsvn для преобразования частей хранилища. Это может привести к нескольким линиям транка или ветвям, которые находятся в отдельном хранилище от основной линии.

Если у вас есть два раздела соединительных линий в отдельных репозиториях, а тот, который находится в каталоге с именем second, непосредственно следует за разделом в каталоге с именем first, вы можете сделать это:

cd second
hg log -r 0
# Note the revision hash
cd ../first
hg tip
# Again, note the revision hash
hg pull -f ../second
hg rebase --source <revision hash from hg log -r 0> --dest <revision hash from hg tip>

Это привьет одну часть ствола к другой части ствола.

Если у вас есть ветка в отдельном репозитории, процедура немного сложнее:

cd branch
hg log -r 0
# Note the revision hash
cd ../trunk
# Find the revision that the branch branches off from and note its hash.
# We will call this revision the 'branch base'.
hg pull -f ../branch
hg rebase --source <revision hash from hg log -r 0> --dest <revision hash of branch base>

Это привьет ветку на главное дерево.

3 голосов
/ 20 января 2010

В соответствии с документами для расширения , должно работать что-то вроде следующего.

$ cat > ~/.hgrc <<EOF
[extensions]
hgext.convert=
EOF
$ hg convert --config convert.svn.trunk trunk/BigProject --config convert.svn.branches branches/BigProject --config convert.svn.tags tags/BigProject svn://svn.example.com/Example newhgrepo
...