12

古いバザールのリポジトリを git に変換しようとしています。

私の bazaar リポジトリは次のように構成されています。

  • レポ
    • トランク
    • 製品
    • 機能/機能-branchX
    • 機能/機能-branchY

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 は

次に、「レポ」ディレクトリ内の他のすべてのフォルダーを繰り返し、呼び出します

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

元の bazaar リポジトリには 80 以上あったブランチが 20 個しかないことを示しています。

ここで、git の「マスター」を見るだけで、すべて揃っているように見えます。欠落している 60 のブランチは、すでにトランクにマージされているブランチである可能性があります。しかし、高速エクスポート/高速インポート ツールが「ああ、これは必要ない」と言うほど賢いかどうかはわかりませんが、おそらくそうです。

誰もこれについて経験がありますか?

「マスター」と、 bzr から git に移行した後、コミットをマージ解除したブランチだけが残っているはずですか?

最後に、歴史のために、たとえ技術的に機能していなくても、すべてのブランチを強制的に変換する方法はありますか?

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 の中にある場合、2 つの可能性があります。B も A である可能性があります。これは、A == B を意味します。そうでない場合、A は本当に冗長です。

スクリプトは、少なくとも 1 つの他のブランチに完全にマージされているブランチを除外します。#ただし、同一のブランチが複数ある場合は、それらすべてを出力し、それらが同一であることを示す で始まる行を追加します。

を使用したコマンド例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が最初に表示された場合、 branchAはGit で作成されません ( 「bah - you will not need this」 )。

Git にインポートするときに、同一のブランチを強制的に作成する方法が見つかりませんでした。ありえないと思います。

于 2013-11-15T21:11:35.730 に答える