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

Sor*_*raz 12 git version-control bazaar migrate git-fast-import

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

我的bazaar存储库结构如下:

  • 回购
    • 树干
    • 特性/功能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
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,我建议使用这些步骤:

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

    git init /tmp/gitrepo
    
    Run Code Online (Sandbox Code Playgroud)
  2. 进入您的Bazaar共享仓库:

    cd /path/to/bzr/shared/repo
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将主分支(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)
  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
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  • 使用此答案时保留所有分支的方法是在转换之前将它们全部标记.`for $ in $(bzr branches); 做cd $ d; bzr tag b_ $ d; cd - ; 完成.这为每个分支制作一个前缀为"b_"的标签.转换后,您可以使用`while read tag_name将这些标记转换为git分支; do git branch $ {tag_name:2} $ tag_name; 完成<<(git tag -l | grep ^ b_)`.从标记重新创建分支时,转换中已存在的分支将只显示它们已存在的错误(无害). (2认同)