2

長く存続しているブランチ (「メトリクス」と呼ばれる) を「トランク」ブランチの最新バージョンにリベースする際に問題があります。目標は、変更をリベースしてから、SVN にコミットすることです。

リベースには現在 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 を超えています。それらをマージするにはどうすればよいですか? それらのすべてに実質的な変更があるわけではありません。

ファイルの「them」バージョン (私の変更) を「us」の場所 (あるべき場所) に移動/コピーしようとしましたが、うまくいかないようでした。

この場合、「git mv」を使用する必要がありますか?

ありがとう。

4

1 に答える 1

1

これは履歴の改訂を伴うため、最善の解決策ではない可能性があります。git filter-branch'metrics' ブランチの/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/ます/src/main/java。これらのパスにある Java ファイルだけが必要な場合は、perlそれに応じてステートメントを変更してください。履歴git ls-files -s | perl -pe <substitution>のさまざまな時点を調べてみると、何が必要かを判断するのに役立ちます。

Git (tm) でできること、上記は非常に思い切ったものです。それでも、ファイル名の問題は解決するはずです。以前にいくつかの長い分岐ブランチのマージを試みたことがありますが、この特定の問題は最後ではありません. ワークフローが非常に多様で長期的な分岐を定期的に生成する場合は、それを変更することを検討してください。

于 2012-07-31T15:16:03.653 に答える