[解決済み] git はどのようにして類似ファイルを検出し、リネームを検出するのですか?
質問
ウィキペディアの自動改名検出について教えてください。
簡単に言うと、リビジョン N のファイルが与えられたとき、リビジョン N-1 の同名のファイルが リビジョン N-1 の同名のファイルがそのデフォルトの先祖になります。しかし、リビジョン N-1 に リビジョン N-1 に同名のファイルがない場合、Git はリビジョン N-1 にのみ存在し、かつ リビジョン N-1 にのみ存在し 非常に似ている であるファイルを探します。
リネーム検出はどうやら類似ファイル検出に帰着するようです。そのアルゴリズムはどこかに文書化されていますか?どのような種類の変換が自動的に検出されるかを知ることは素晴らしいことです。
どのように解決するのですか?
Gitはファイル名ではなく、ファイルの内容を追跡します。そのため、内容を変更せずにファイル名を変更することは、gitにとって簡単に検出できます。(Gitは追跡しませんが
検出
を使用しています。
git mv
または
git rm
そして
git add
は事実上同じです)。
ファイルがリポジトリに追加されるとき、ファイル名はツリーオブジェクトの中にあります。実際のファイルの中身はバイナリラージオブジェクト( ブロブ ) としてリポジトリに追加されます。Gitは、同じコンテンツを含む追加のファイルに対して別のblobを追加することはありません。実際、ハッシュの最初の2文字がディレクトリ名、残りがその中のファイル名となり、コンテンツはファイルシステムに格納されるため、Gitはそれを行うことができません。ですから、リネームを検出するのは、ハッシュを比較する問題なのです。
リネームされたファイルへの小さな変更を検出するために、Gitは特定のアルゴリズムと閾値制限を使用して、これがリネームであるかどうかを判断します。たとえば
-M
のフラグを見てみましょう。
git diff
. また、次のような設定値もあります。
merge.renameLimit
(マージ中にリネーム検出を行う際に考慮するファイル数) のような設定値もあります。
をどのように扱うかを理解するために、git は と同様の をどのように扱うのか (つまり、どのようなファイル変換をリネームとみなすのか) を理解するには、上で述べたように利用可能な設定オプションやフラグを調べます。方法については考慮する必要はありません。git が実際にどのようにこれらのタスクを達成しているかを理解するには、テキストの差分を見つけるためのアルゴリズムを見て、git のソースコードを読んでみてください。
アルゴリズムは diff、merge、log の目的のためにのみ適用されます -- git がどのように保存するかには影響しません。ファイルの内容におけるどんな小さな変更も、そのために新しいオブジェクトが追加されることを意味します。そのレベルでは、デルタやディフが発生することはありません。もちろん、後で、差分が packfiles に保存される場所にオブジェクトがパックされるかもしれませんが、それはリネームの検出とは関係ありません。
関連
-
[解決済み】Git リポジトリから .DS_Store ファイルを削除するには?
-
Note: Git prompts このリポジトリで別の git プロセスが実行されているようです ....
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] git に自分の好きなエディタを使わせてコミットするにはどうしたらいいですか?
-
[解決済み] Git で現在のコミットのハッシュを取得する方法は?
-
[解決済み] Git はシンボリックリンクをどのように扱うのですか?
-
[解決済み] ローカルにあるファイルを無視するようにgitを設定するにはどうすればよいですか?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
gitlab をアップロード ! [リモート拒否] dev -> dev (受信前のフックが拒否されました)
-
undefinedGit Git がファイルをコードクラウドにプッシュする際に報告されるエラーを解決します: ! [拒否] master -> master (最初にフェッチ)
-
git を使用してリモートリポジトリを更新する場合、現在のブランチの先端がエラーの背後にあるため、更新が拒否されました。
-
コミットメッセージが空だったため、コミットを中止する git commit
-
giteaを使ったGitサービスの構築
-
gitlabの紹介と使い方
-
git-fatal: 設定されたプッシュターゲットがありません / 警告: store/README.md の LF は CRLF に置き換えられています。
-
[解決済み] Git は、省略形のコミット ID が 2 つの異なるコミットを参照する場合に警告を発しますか?
-
[解決済み] 対話式リベースを中断する方法(--abort が効かない場合)?
-
[解決済み] 別のユーザーでコードをコミットするにはどうすればよいですか?