将大bzr存储库转换为git,可以期待什么?

时间:2013-11-12 13:44:35

标签: git version-control bazaar migrate git-fast-import

我正在尝试将一些旧的集市仓库转换成git,虽然一切似乎顺利进行,但我有点不确定它是否真的像它声称的一样好。

我的集市仓库的结构如下:

  • 回购
    • 躯干
    • 特征/特征branchX
    • 特征/特征多枝

我正在使用快速导出/快速导入方法在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”和任何未合并的提交?

最后,为了历史,有没有办法强迫所有分支转换过来,即使它们在技术上已经不存在了?

1 个答案:

答案 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最后的示例,我建议改为使用这些步骤:

  1. 创建一个全新的Git仓库:

    git init /tmp/gitrepo
    
  2. 进入您的Bazaar共享仓库:

    cd /path/to/bzr/shared/repo
    
  3. 将主分支(trunk?)迁移为主分支:

    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
    
  5. 如果您注意到最后一步没有检查您已迁移的主干。没关系,因为它无论如何都不会再次导入它。另请注意,即使 branchA 完全合并到 branchB 中,如果首先看到它,也会在Git 中创建。如果首先看到 branchB ,那么 branchA 将不会在Git中创建(“bah - 你不需要这个”)。< / p>

    导入到Git时,我找不到强制创建相同分支的方法。我不认为这是可能的。