Преобразование репозитория big bzr в git, чего ожидать?


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

Мой базарный репозиторий структурирован следующим образом:

  • РЕПО
    • хобот
    • прод
    • особенность / feature-branchX
    • особенность / feature-branchY

Я использую метод быстрого экспорта/быстрого импорта для миграции между bzr и git.

Первоначально, Я перенесите "ствол", с -- export-метками, вот так:

bzr fast-export --export-marks=../$1/marks.bzr ../$1/trunk | git fast-import --export-marks=../$1/marks.bzr --export-marks=../$1/marks.git

С $1, являющимся именем

Затем повторите все остальные папки в директории" repo " и вызовите

bzr fast-export --marks=../$1/marks.bzr  --git-branch=$nick ../$1/$b/.. | git fast-import --import-marks=../$1/marks.git --export-marks=../$1/marks.git

С $nick, являющимся ником ветви bzr,и $1/$b, являющимся именем каталога ветви.

Как я уже сказал, он обрабатывает все ожидаемые каталоги, но после завершения, когда я делаю

git branch

Он показывает всего 20 с чем-то ветвей, где исходный репозиторий базара имел 80+.

Теперь, просто глядя на "мастера" в git, кажется, что все там, и недостающие 60 ветвей легко могут быть ветвями, которые уже слились в ствол. Но я не совсем уверен, что инструменты быстрого экспорта/быстрого импорта достаточно умны, чтобы сказать: "ба-вам это не понадобится", но, возможно, это так.

Есть ли у кого-нибудь опыт в этом?

Предполагается ли, что я должен остаться только с "мастером" и любой ветвью, которая имеет незамкнутые коммиты в них после миграции из bzr в git ?

Наконец, для ради истории, есть ли какой-либо способ заставить все ветви быть преобразованными, даже если они технически не функционируют?

1 12

1 ответ:

Похоже, что инструменты быстрого импорта/экспорта действительно достаточно умны, чтобы сказать"ба-вам это не понадобится". Однако это не ракетостроение, точно так же, как git branch -d знает, когда безопасно удалить ветвь, так и git fast-import может знать, что входящая ветвь является репликой.

, но, вероятно, вы захотите быть действительно уверены, , и я согласен. Я собрал простой (хотя и неэффективный) скрипт, чтобы найти список уникальных ветвей bzr:

#!/bin/sh

paths=$(bzr branches -R)

for path1 in $paths; do
    merged=
    for path2 in $paths; do
        test $path1 = $path2 && continue
        # is path1 part of path2 ?
        if bzr missing -d $path1 $path2 --mine >/dev/null; then
            # is path2 part of path1 ?
            if bzr missing -d $path1 $path2 --other >/dev/null; then
                echo "# $path1 == $path2"
            else
                merged=1
                break
            fi
        fi
    done
    test "$merged" || echo $path1
done

Запустите это внутри общего базара хранилище. Он находит все ветви,а затем сравнивает все ветви со всеми другими. Если A находится в B, то есть две возможности: возможно, B также является A, что означает A == B. В противном случае A действительно избыточен.

Скрипт отфильтровывает ветви, которые полностью объединены по крайней мере в одну другую ветвь. Однако, если существует несколько идентичных ветвей, он выводит все из них, с дополнительными строками, начинающимися с #, чтобы указать, что они идентичны.

Ваш пример команды с bzr fast-export ... | git fast-import ..., похоже, имеют некоторые ненужные опции. Следуя примерам в самом конце bzr fast-export -h, я рекомендую вместо этого использовать следующие шаги:

  1. Создайте совершенно новый РЕПО Git:

    git init /tmp/gitrepo
    
  2. Зайдите в свой общий РЕПО базара:

    cd /path/to/bzr/shared/repo
    
  3. Перенесите свою главную ветвь (ствол?) быть хозяином:

    bzr fast-export --export-marks=marks.bzr trunk/ | \
      GIT_DIR=/tmp/gitrepo/.git/ git fast-import --export-marks=marks.git
    
  4. Перенести все ветви:

    bzr branches -R | while read path; do
        nick=$(basename $path)
        echo migrating $nick ...
        bzr fast-export --import-marks=marks.bzr -b $nick $path | \
          GIT_DIR=/tmp/gitrepo/.git git fast-import --import-marks=marks.git \
          &>/tmp/migration.log
    done
    

Если вы заметили, что последний шаг не проверяет наличие ствол которого вы уже мигрировали. Это не имеет значения, так как он все равно не будет импортировать его снова. Также обратите внимание, что даже если branchA полностью объединена в branchB, она будет создана в Git , если ее увидеть первой. Если branchB будет замечен первым, то branchA не будет создана в Git ("ба - вам это не понадобится").

Я не смог найти способ принудительного создания идентичных ветвей при импорте в Git. Я не думаю, что это возможно.