Конвертирование большого bzr-репозитория в git, чего ожидать?
Я пытаюсь преобразовать некоторые старые репозитории базаров в git, и хотя все, кажется, проходит гладко, я немного не уверен, действительно ли это прошло так, как требовалось.
Мой базарный репозиторий имеет следующую структуру:
- Сделки рЕПО
- хобот
- тычок
- особенность / функция-branchX
- особенность / функция-ветвистый
Я использую метод fast-export/fast-import для миграции между bzr и git.
Первоначально я переносил "транк" с --export-marks, например так:
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 веток могут легко быть ветвями, которые уже объединены в транк. Но я не совсем уверен, что инструменты быстрого экспорта / быстрого импорта достаточно умны, чтобы сказать "ба - тебе это не понадобится", но, возможно, они есть.
У кого-нибудь есть опыт с этим?
Должен ли я остаться только с "master" и любой веткой, в которой есть неотправленные коммиты после перехода с bzr на git?
Наконец, ради истории, есть ли способ заставить все ветви быть преобразованы, даже если они технически не существуют?
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
Запустите это внутри общего хранилища Bazaar. Он находит все ветви, а затем сравнивает все ветви со всеми остальными. Если A находится в B, то есть две возможности: возможно, B также является A, что означает A == B. В противном случае A действительно избыточен.
Сценарий отфильтровывает ветви, которые полностью объединены по крайней мере с одной другой веткой. Однако, если есть несколько идентичных ветвей, он печатает все из них, с дополнительными строками, начинающимися с #
чтобы указать, что они идентичны.
Ваш пример команд с 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, если его увидят первым. Если сначала просматривается BranchB, то BranchA не будет создана в Git ("Бах - вам это не понадобится").
Я не смог найти способ заставить создавать одинаковые ветки при импорте в Git. Я не думаю, что это возможно.