1

JavaEEアプリケーションを含むSVNリポジトリをGitリポジトリに変換しようとしています。元のリポジトリには、Java EEプロジェクトの各部分のフォルダが含まれており、履歴ごとに個別のプロジェクトとして維持されています。2つのプロジェクトには、「本番」ブランチ(ここでも2つの別々のブランチ)があり、新しいリビジョンが本番トランクに入るたびに、本番にマージされます。

これを単一のgitリポジトリにインポートすると(ベストプラクティスであると理解しています)、マスター内のすべてが正常ですが、ブランチに切り替えると、そのブランチのファイルのみが取得され、他のほとんどのフォルダーとファイルが表示されなくなります。

リポジトリレイアウト:

/
trunk/
   project1/
   project2/
   project3/
   project4/
branches/
   project3-production-branch/
   project4-production-branch/
tags/

この問題に関するEricGwinの投稿を見つけましたが、解決策が見つかりませんでした。http://comments.gmane.org/gmane.comp.ide.eclipse.git/77

ここでは非常に初歩的なものを見落としているかもしれませんが、唯一の解決策はプロジェクトを個別にインポートすることだと思いますか?SVNリポジトリ全体をインポートしてGitで動作するブランチを取得する方法についての提案はありますか?

4

1 に答える 1

1

初期状況

これを単一のリポジトリに変換すると、マスター (またはトランク) のディレクトリ構造は次のようになります。

project1/
project2/
project3/
project4/

の最初のコミット後の構造は次のproject3-production-branchようになります。

project3/

または、project3 の内容が直接含まれています。

.project
src/
test/

これは、ブランチが Subversion のどこからコピーされたかによって異なります。

最初のケースでは、次のステップをスキップできます。

どちらの場合も、他のすべてのプロジェクトはブランチで削除されており (最初のコミットの差分で確認できます)、復元する必要があります。2 番目のステップを参照してください。

ステップ 1: ブランチを書き換えて、すべてのコンテンツをサブディレクトリに移動します (必要な場合)。

filter-branch の「ツリー全体をサブディレクトリに移動するには」の例を参照し、次のようにブランチでのみ実行します。

git filter-branch --index-filter \
    'git ls-files -s | sed "s-\t\"*-&project3/-" |
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
            git update-index --index-info &&
     mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' \
     master..project3-production-branch

ステップ 2: ブランチを書き換えて他のプロジェクトを復元する

このステップでは、最初のブランチ コミットで他のプロジェクトの削除を元に戻したいと考えています。これは、次を使用して実行できます。

branch="project3-production-branch"
parent=`git merge-base $branch master` # or replace master with trunk if needed
paths="project1 project2 project4"
git filter-branch -f --index-filter \
"git reset -q $parent -- $paths" --tag-name-filter cat -- \
$parent..$branch

ブランチからのすべてのコミットについて、他のパスをブランチが作成されたときの状態にリセットします。

于 2013-03-18T15:50:36.493 に答える