Sor*_*raz 12 git version-control bazaar migrate git-fast-import
我正在尝试将一些旧的集市存储库转换为git,虽然一切似乎都顺利进行,但我有点不确定它是否真的像它声称的那样好.
我的bazaar存储库结构如下:
我正在使用快速导出/快速导入方法在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
Run Code Online (Sandbox Code Playgroud)
以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
Run Code Online (Sandbox Code Playgroud)
$ nick是bzr的分支昵称,$ 1/$ b是分支的目录名称.
正如我所说,它处理所有预期的目录,但在完成后,我做了一个
git branch
Run Code Online (Sandbox Code Playgroud)
它显示了20个分支,原始的集市存储库有80多个.
现在,只是在git中查看"master",它似乎就在那里,缺少的60个分支很容易成为已经合并到trunk中的分支.但我不确定快速导出/快速导入工具是否足够巧妙地说"呸 - 你不会需要这个",但也许它们是.
有人对这个有经验么?
在从bzr迁移到git之后,我是否应该留下"master"和任何已经在其中保留未提交的分支?
最后,为了历史,有没有办法强迫所有分支转换,即使它们在技术上已经不存在了?
Sto*_*ica 14
似乎快速导入/导出工具确实足够聪明地说"呸 - 你不会需要这个".这不是火箭科学,就像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
Run Code Online (Sandbox Code Playgroud)
在Bazaar共享存储库中运行它.它找到所有分支,然后将所有分支与所有其他分支进行比较.如果A在B中,那么有两种可能性:也许B也是A,这意味着A == B.否则A实际上是多余的.
该脚本过滤掉完全合并到至少一个其他分支的分支.但是,如果有多个相同的分支,则会打印所有这些分支,并以其他行开头,#表示它们是相同的.
您的示例命令bzr fast-export ... | git fast-import ...似乎有一些不必要的选项.按照最后的示例bzr fast-export -h,我建议使用这些步骤:
创建一个全新的Git仓库:
git init /tmp/gitrepo
Run Code Online (Sandbox Code Playgroud)进入您的Bazaar共享仓库:
cd /path/to/bzr/shared/repo
Run Code Online (Sandbox Code Playgroud)将主分支(trunk?)迁移为主分支:
bzr fast-export --export-marks=marks.bzr trunk/ | \
GIT_DIR=/tmp/gitrepo/.git/ git fast-import --export-marks=marks.git
Run Code Online (Sandbox Code Playgroud)迁移所有分支:
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
Run Code Online (Sandbox Code Playgroud)如果您注意到最后一步没有检查您已迁移的主干.没关系,因为它无论如何都不会再次导入它.另请注意,即使branchA完全合并到branchB中,如果首先看到它,也会在Git中创建它.如果首先看到branchB,那么将不会在Git中创建branchA("bah - 你不需要这个").
导入到Git时,我找不到强制创建相同分支的方法.我不认为这是可能的.
| 归档时间: |
|
| 查看次数: |
2592 次 |
| 最近记录: |