12

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

我的集市存储库的结构如下:

  • 回购
    • 树干
    • 产品
    • 功能/功能分支X
    • 特征/特征分支Y

我正在使用快速导出/快速导入方法在 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 个分支,而原来的 bazaar 存储库有 80 多个。

现在,只看git中的“master”,它似乎都在那里,丢失的60个分支很容易是已经合并到主干的分支。但是我不确定快速导出/快速导入工具是否足够聪明,可以说“哇——你不需要这个”,但也许它们是。

有人对这个有经验么?

从 bzr 迁移到 git 后,我​​是否只应该留下“master”和任何未合并提交的分支?

最后,为了历史的缘故,有没有什么办法可以强制所有的分支都被转换过来,即使它们在技术上已经失效了?

4

1 回答 1

15

似乎快速导入/导出工具确实足够聪明,可以说“呸——你不需要这个”。但这不是火箭科学,就像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. 迁移您的主分支(主干?)成为主分支:

    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
    

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

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

于 2013-11-15T21:11:35.730 回答