Gitはファイル名ではなくファイルの内容を追跡します。したがって、内容を変更せずにファイルの名前を変更することは、gitが検出するのは簡単です。 (Gitは追跡が、検出実行しない; git mv
又はgit rm
とgit add
が効果的に同じである使用)
ファイルをリポジトリに追加されると、ファイル名がツリーオブジェクトです。実際のファイルの内容は、バイナリラージオブジェクト(blob)としてリポジトリに追加されます。 Gitは、同じコンテンツを含む追加のファイルに別のBLOBを追加しません。実際、Gitはコンテンツがファイルシステムに格納されているので、ハッシュの最初の2文字はディレクトリ名であり、残りはファイル名です。したがって、名前の変更を検出するには、ハッシュを比較する必要があります。
名前が変更されたファイルの小さな変更を検出するために、Gitは特定のアルゴリズムとしきい値の制限を使用して名前の変更を確認します。たとえば、git diff
のフラグ-M
を見てください。 merge.renameLimit
(マージ中に名前の変更を検出するときに考慮するファイルの数)などの構成値もあります。
類似ファイル(つまり、どのファイル変換が名前変更と見なされるか)を扱う方法を理解するには、前述のように、使用可能な設定オプションとフラグを調べてください。あなたは方法で考慮する必要はありません。 gitが実際にこれらのタスクをどのように実行するかを理解するには、テキストの違いを見つけるアルゴリズムを見て、gitのソースコードを読んでください。
アルゴリズムは差分、マージ、ログの目的にのみ適用され、gitの格納方法には影響しません。ファイル内容のわずかな変更は、新しいオブジェクトが追加されたことを意味します。そのレベルではデルタや差分は起こっていません。もちろん、後で、デルタがパックファイルに格納されているオブジェクトはパックされるかもしれませんが、名前の変更の検出には関係しません。
素晴らしいサマリー、ありがとうございます。 – mahemoff
+1 ** **単語**を強調するために+1 – akhyar
_ "あなたは方法を考慮する必要はありません" _ - 私はそれが質問だと思った? – bain