2012-04-04 7 views
2

私の長期ブランチ(「メトリック」と呼ばれる)を私の「トランク」ブランチの最新バージョンにリベースすることに問題があります。目標は私の変更を元に戻し、SVNにコミットすることです。移動したファイルでgit-svn rebaseを解決するには?

リベースには75ステップあり、ステップ40では、svnに再配置されたファイルに重要なソースコードの変更が適用されています。

特に、私は/java/**/*.java内のファイルに多くの変更を加えました。一方、これらのファイルは/src/main/java/**/*.javaに再配置されました。

gitのステータスは示しています

# Not currently on any branch. 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# 
# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
# added by them:  java/StripesResources.properties 
.... (many files like this) 
# both deleted:  src/StripesResources.properties 
.... (many files like this) 
# added by us:  src/main/java/StripesResources.properties 
.... (many files like this) 

この状態で900以上のファイルがありますが、私はそれらをマージする何をしますか?それらのすべてが実質的に変化するわけではありません。

ファイルの「それらの」バージョン(自分の変更)を「私たち」の場所に移動しようとしましたが、動作していないようです。

ここでは 'git mv'を使用する必要がありますか?

ありがとうございました。

+0

これは難しい問題のようです。私はあなたのブランチをマージする前に、あなたが行った更新が適用される前にファイルがトランク内の新しい場所に移動されるように、そのコピーの履歴を変更しなければならないかもしれないと思います。 – antlersoft

+0

残念ながら、ファイルは正しい場所にありません。これらの変更をすでにトランクから私の「メトリック」ストリームにマージしているので、ファイルはすでに正しい場所にあります。しかしgitはそれを認識していないようです。 – JBCP

+0

マージがどのようにクリーンアップされるかは重要ではありません。もしあなたがそれを行い、インデックスに変更を加えることができれば、リベースを続けることができます。この時点でgitが本当に混乱している場合は、2つのツリーのコピー(たとえばdiff3を使用)からrebaseツリーにファイルごとのマージを行い、git mvを実行するスクリプトを作成する必要がありますマージされたファイルをどこに置くべきかを指定します。 – antlersoft

答えて

1

これは、履歴の改訂を伴うため、これは最善の解決策ではないかもしれません。 git filter-branchを使用して、 'metrics'ブランチの/java/**/*.javaファイルを/src/main/java/**/*.javaに移動し、その後リベースすることができます。まず、リポジトリをバックアップします。効果的にそのパス/src/main/javaから/java/で始まるすべてのファイルを移動し、

git checkout metrics 
git filter-branch --index-filter ' 
    git ls-files -s | 
     perl -pe "s{\t/java/\"?}{\t/src/main/java/}" | 
     GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && 
    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE 
' HEAD 

あなたのブランチメトリックの歴史を書き換えます。そして、このような何かを試してみてください。これらのパスにjavaファイルだけが必要な場合は、それに応じてperlステートメントを変更してください。あなたの歴史の様々な時点でgit ls-files -s | perl -pe <substitution>で悩むと、必要なものを決定するのに役立ちます。

Git(tm)で実行できること上記は非常に劇的です。すべて同じ、それはファイル名の問題を解決する必要があります。これまでにいくつかの分岐点のマージを試みてきましたが、この問題はあなたの最後の問題ではありません。ワークフローで分岐した長期的なブランチが定期的に生成される場合は、そのブランチを変更することを検討することもできます。