ブログ投稿「Confluence、git、rename、merge oh my… 」には、 Robieの回答(賛成)を示す興味深い情報が追加されています。
名前の変更を検出しようとすると、git は正確な名前変更と不正確な名前変更を次のように区別します。
- 前者はファイルの内容を変更せずに名前を変更し、
- 後者は、ファイルの内容の変更を含む可能性のある名前変更 (Java クラスの名前変更/移動など)。
正確な名前変更を検出するアルゴリズムは線形であり、常に実行されますが、不正確な名前変更検出のアルゴリズムは 2 次 ( O(n^2)
) であり、変更されたファイルの数が特定のしきい値 (1000 byデフォルト)。
明示的に設定されていない場合、merge.renameLimit
デフォルトで 1000 ファイルに設定されるdiff.renameLimit
か、設定されている場合の値が使用されます。
、およびdiff.renameLimit
whileはgit diff
、マージ試行 ( 、) のみに適用されます。git show
git log
merge.renameLimit
git merge
git cherry-pick
merge.renameLimit
を変更するのではなく、 を変更しdiff.renameLimit
て、出力を見るなどの一般的な操作中に git が名前の変更を検出しないようにすることをお勧めしgit diff
ます。
git show
名前の変更を表示するには、またはのようなコマンドを、名前変更の検出をオンにするオプションgit log
と共に使用できます。-M
ライナスは次のように述べています。
ええ、カーネルのために、私は持っています
[diff]
renamelimit=0
デフォルトの制限は実際には非常に低いため、制限を完全に無効にします。Git は、名前変更の検出が非常に得意です。
ただし、デフォルトが低い理由は、それが十分に機敏ではないからではなく、最終的に大量のメモリを使用する可能性があるためです (メモリが不足している場合、スワッピングは「かなり機敏」から「非常に機敏」になることを意味します)。 「糖蜜のように遅い」-しかし、それでもCPUが制限されることはなく、狂ったようにページングするだけです)。