我正在尝试将一些旧的集市仓库转换成git,虽然一切似乎顺利进行,但我有点不确定它是否真的像它声称的一样好。
我的集市仓库的结构如下:
我正在使用快速导出/快速导入方法在bzr和git之间进行迁移。
最初,我使用--export-marks迁移“trunk”,如下所示:
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中查看“master”,它似乎就在那里,缺少的60个分支很容易成为已经合并到trunk中的分支。但我不确定快速导出/快速导入工具是否足够聪明,可以说“呸 - 你不需要这个”,但也许它们是。
有没有人有这方面的经验?
在从bzr迁移到git之后,我是否只应该留下“master”和任何未合并的提交?
最后,为了历史,有没有办法强迫所有分支转换过来,即使它们在技术上已经不存在了?
答案 0 :(得分:14)
快速导入/导出工具似乎确实足够聪明,可以说“bah - 你不需要这个”。这不是火箭科学,就像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
将主分支(trunk?)迁移为主分支:
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中创建(“bah - 你不需要这个”)。< / p>
导入到Git时,我找不到强制创建相同分支的方法。我不认为这是可能的。