81

Web アプリケーション プロジェクトで Maven の使用を開始したため、ディレクトリ階層が変更されました。Maven 統合用の新しいブランチを作成しました。現在、古いディレクトリ階層を持つブランチと、maven ディレクトリ階層を持つブランチの 2 つがあります。両方のブランチに新しいコミット (バグ修正と新機能) があります。

古いブランチを取り除き、その変更を Maven ブランチにマージしたいと思います。Git マージは、解決できないと思われる無数の競合を引き起こします。これは、ファイルパスが変更されたためだと思います。

このマージにアプローチする最良の方法は何ですか?

4

2 に答える 2

174

merge.renameLimitこのマージのために高い値に設定してみてください。git は名前の変更を検出しようとしますが、O(n^2) の処理時間が必要なため、ファイル数がこの制限を下回っている場合のみです。

git config merge.renameLimit 999999

完了したら:

git config --unset merge.renameLimit
于 2011-01-18T09:53:40.733 に答える
27

ブログ投稿「Confluence、git、rename、merge oh my… 」には、 Robie回答(賛成)を示す興味深い情報が追加されています。

名前の変更を検出しようとすると、git は正確な名前変更と不正確な名前変更を次のように区別します。

  • 前者はファイルの内容を変更せずに名前を変更し、
  • 後者は、ファイルの内容の変更を含む可能性のある名前変更 (Java クラスの名前変更/移動など)。

正確な名前変更を検出するアルゴリズムは線形であり、常に実行されますが、不正確な名前変更検出のアルゴリズムは 2 次 ( O(n^2)) であり、変更されたファイルの数が特定のしきい値 (1000 byデフォルト)。

明示的に設定されていない場合、merge.renameLimitデフォルトで 1000 ファイルに設定されるdiff.renameLimitか、設定されている場合の値が使用されます。
、およびdiff.renameLimitwhileはgit diff、マージ試行 ( 、) のみに適用されます。git showgit logmerge.renameLimitgit mergegit cherry-pick

merge.renameLimitを変更するのではなく、 を変更しdiff.renameLimitて、出力を見るなどの一般的な操作中に git が名前の変更を検出しないようにすることをお勧めしgit diffます。

git show名前の変更を表示するには、またはのようなコマンドを、名前変更の検出をオンにするオプションgit logと共に使用できます。-M

ライナスは次のように述べています

ええ、カーネルのために、私は持っています

    [diff]
            renamelimit=0

デフォルトの制限は実際には非常に低いため、制限を完全に無効にします。Git は、名前変更の検出が非常に得意です。

ただし、デフォルトが低い理由は、それが十分に機敏ではないからではなく、最終的に大量のメモリを使用する可能性があるためです (メモリが不足している場合、スワッピングは「かなり機敏」から「非常に機敏」になることを意味します)。 「糖蜜のように遅い」-しかし、それでもCPUが制限されることはなく、狂ったようにページングするだけです)。

于 2012-10-29T09:18:34.150 に答える