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

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

Мой базарный репозиторий структурирован так:

  • репо
    • багажник
    • прод
    • Функция/функция-branchX
    • Функция/функция-веткистый

Я использую метод fast-export/fast-import для миграции между 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 +.

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

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

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

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

Ответ 1

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

Но, наверное, вы бы действительно были уверены, и я согласен. Я собрал простой (если неэффективен) script, чтобы найти список уникальных ветвей 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

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

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

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

  • Создайте новый Git репо:

    git init /tmp/gitrepo
    
  • Входите в общий репозиторий Bazaar:

    cd /path/to/bzr/shared/repo
    
  • Перенесите главную ветку (ствол?) в качестве ведущего:

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

    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, если он будет показан первым. Если ветвь B видна первой, то branchA не будет создан в Git ( "bah - вам это не понадобится" ).

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