3

私のプロジェクト (約 200 万行のコードと数万のコミットというかなり大規模なもの) は、現在 git-svn から git に切り替えています。多くのユーザーは、新しい純粋な git リポジトリにあると便利な履歴を持つ git-svn ブランチを持っています。基本シナリオはこんな感じ

古い git-svn リポジトリ:

A-B-C-D-E-F (master)

このリポジトリには、マスターを数回マージしたブランチがあります。

    G-H---I-J-K (feature)
   /     /
A-B-C-D-E-F (master)

このブランチを新しい pure-git リポジトリに移動し、履歴を維持したいと考えています。さらに複雑なことに、pure-git リポジトリと svn リポジトリのディレクトリ構造はわずかに異なります。具体的には、このリポジトリのベース ディレクトリ構造には、次のような 2 つのディレクトリがあります。

foo/ bar/

新しい git リポジトリでbar/は、新しいリポジトリに移動されました。

このブランチを新しいリポジトリに移動して、pure-git リポジトリでこのような結果になるにはどうすればよいですか?

    G'-H'----I'-J'-K' (feature)
    /       /
A'-B'-C'-D'-E'-F' (master)

私は次のことがうまくいくと思いました:

git-svn リポジトリの機能ブランチから:

git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch bar" B..HEAD

新しいレポには存在しない foo ディレクトリへのすべての変更を削除する必要があります。次に、純粋な git リポジトリのリモートとして git-svn リポジトリを追加し、pure-git リポジトリからこれを実行します。

git checkout -b B' feature
git rebase --preserve-merges --onto feature remotes/old_git_svn_repo/master remotes/old_git_svn_repo/feature

残念ながら、これはうまくいかないようです。機能ブランチで既に解決したすべてのマージ競合を手動で解決する必要があります。私がやりたいことをする方法はありますか?

4

1 に答える 1