15

svn2gitを使用して SVN プロジェクトを git に移行しようとしています。ただし、すべての履歴を保存するのに問題があります。理由は過去にトランクを移動したためと思われます。私が使用しているコマンドは次のとおりです。

$ svn2git http://mysvnserver.com/myproject/iPhone/ --no-minimize-url --authors ../authors.txt

しかし、これは 2011 年までさかのぼる歴史しかありません。プロジェクトは実際には 2010 年に開始されました。プロジェクトは次のように始まりました。

myproject
   trunk
   branches
   tags

しかし、2011 年に次のように変更されました。

myproject
   iPhone
     trunk
     branches
     tags
   Android
      trunk
      branches
      tags

古いトランクとブランチは iPhone ディレクトリの下にありました。この移動が行われたときから始まる歴史。iPhone ディレクトリで行うsvn logと、短縮された履歴が表示されます。しかし、もしそうなら、私cd trunk; svn logは完全な歴史を手に入れます。

この履歴をどのように取得するかはわかりません。私のアイデアは、2010 年までさかのぼるトランクの履歴のみを含む git リポジトリを何らかの方法で作成することでした。その後、後でこれをメイン リポジトリのブランチとして取り込み、リベースを実行して履歴を正しくします。しかし、トランクだけのためにこのレポを作成することはできませんでした。私が試してみました:

$ svn2git http://mysvnserver.com/myproject/ --rootistrunk --authors ../authors.txt

$ svn2git http://mysvnserver.com/myproject/ --rootistrunk -no-minimize-url --authors ../authors.txt

成功せずに。

4

2 に答える 2

15

私自身も同じ問題を抱えていました。これが私がそれを解決した方法です。

両方のリポジトリを個別に複製します。

git svn clone -s [original-svn-location] [original-clone-directory]
git svn clone -s [new-svn-location] [new-clone-directory]

古いクローン データを新しいリポジトリに追加します。

cd [new-clone-directory]
git remote add oldstuff ../[original-clone-directory]
git fetch oldstuff

ここでトリッキーな部分...git logmaster行いますoldstuff/master(または、おそらくtrunkand olstuff/trunk-- ただし、設定します)。新しいクローンからの最初のコミット sha と古いクローンからの最後のコミット sha (移動の直前) を書き留めます。 .

git replace [first-commit-sha-from-new-clone] [last-commit-sha-from-old-clone]

そして、SHA ハッシュを書き換えて、すべてがコーシャになり、replace ref が不要になるようにします...

git filter-branch

次に、不要になった参照をクリーンアップします。

git remote rm oldstuff
rm -rf .git/refs/replace

履歴から最初のコミットが失われますが、それは最初の移動である (つまり、実際のファイルの内容は変更されていない) ため、おそらく問題にはなりません。

これで、すべての履歴が維持され、git blameレポートはレポの古い履歴を記憶するようになり、正確な情報が再び得られます。

必要に応じて何度でもこれを繰り返すことができるはずです (プロジェクトがルートの場所を変更した回数や、移動の両側でコミットされたブランチの数に応じて)。

PS - このソリューションは、ここで見つけたものから自分のニーズに合わせて調整しました(リポジトリで彼のグラフトアプローチを機能させることはできませんでしたが、replace を使用すると美しく機能するようです)。

于 2014-06-18T23:54:01.007 に答える
3

SubGitを使用して SVN リポジトリを変換できます。

残念ながら、バージョン 1.0 はあなたが持っているような複雑なレイアウトをサポートしていません。しかし、それをうまく処理する1.1 EAP バージョンがあります。1.0 と 1.1 の両方のバージョンがローカル SVN リポジトリで動作するため、SVN リポジトリへの管理アクセスが必要です。

SVN リポジトリを Git に変換するには、次の手順を実行してください。

  1. 初期構成を生成します。

    $ subgit configure SVN_REPO
    
  2. ほとんどの場合、SubGit はこのリポジトリ内の 2 つのプロジェクトを検出します。知る限り、必要な Git リポジトリは 1 つだけです。そのため、構成ファイルに 'git' セクションを 1 つだけ保持する必要があります。そこで変換する必要があるすべてのブランチを指定します。

    $ EDITOR SVN_REPO/conf/subgit.conf
    [core]
        ...
    [git "default"]
        repository = .git
        ...
        trunk = trunk:refs/heads/master
        branches = branches/*:refs/heads/*
        tags = tags/*:refs/tags/*
        shelves = shelves/*:refs/shelves/*
        branches = iPhone/trunk:refs/heads/iPhone/master
        branches = iPhone/branches/*:refs/heads/iPhone/*
        tags = iPhone/tags/*:refs/tags/iPhone/*
        branches = Android/trunk:refs/heads/Android/master
        branches = Android/branches/*:refs/heads/Android/*
        tags = Android/tags/*:refs/tags/Android/*
        ...
    [daemon]
        ...
    
  3. SVN を Git に変換します。

    $ subgit install SVN_REPO
    
  4. この時点で、SubGit はすべてのリビジョンを SVN から Git に変換します。変換された Git リポジトリは SVN_REPO/.git にあります。さらに、SubGit は SVN と Git リポジトリの同期を維持し、それを実現するために特別なフックをインストールします。必要に応じて、これらのフックを取り除きます。

    $ subgit uninstall --purge SVN_REPO
    

それで全部です。これで、履歴全体が保持された状態で Git リポジトリが変換されました。

SubGit は商用製品ですが、この種の 1 回限りの変換は無料です。うまくいきますように。

于 2012-11-22T16:26:35.667 に答える