私は2つのファイルindex.html
とを持っていますtemplate.html
。私はほとんどをに移動index.html
しましtemplate.html
たが、両方のファイルを追加すると、gitは名前を変更したと見なします。特定の場合にこれを防ぐことは可能ですか?
4 に答える
Gitがあなたのファイルをコピーだと考える理由
Gitはファイル名ではなくコンテンツを追跡します。その結果、2つのファイルの内容が実質的に類似している場合、gitはファイルをコピーまたは名前変更したと見なします。git-log(1)を読むと、次のことがわかります。
類似性指数は変更されていない線のパーセンテージであり、非類似性指数は変更された線のパーセンテージです。これは切り捨てられた整数であり、その後にパーセント記号が続きます。したがって、類似性インデックス値100%は、2つの等しいファイル用に予約されていますが、100%の非類似性は、古いファイルからの行が新しいファイルにならないことを意味します。
したがって、類似性インデックスが100%であると仮定すると、gitはそれがコピーであると見なします。最善の策は、賢明なログメッセージまたはメモを追加して(詳細についてはgit-notes(1)を参照)、gitが正しいことをしていると思わない場合に何が起こっているかを説明することです。
類似性指数の調整
また、コピーや名前の変更を検討するためにgitが使用する値を調整してみることもできます。git-log(1)のマニュアルには次のように書かれています。
-M[<n>], --find-renames[=<n>]
If generating diffs, detect and report renames for each commit. For
following files across renames while traversing history, see --follow. If
n is specified, it is a threshold on the similarity index (i.e. amount
of addition/deletions compared to the file’s size). For example, -M90%
means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.
-C[<n>], --find-copies[=<n>]
Detect copies as well as renames. See also --find-copies-harder.
If n is specified, it has the same meaning as for -M<n>.
繰り返しになりますが、ファイルがほとんど類似している場合、これは役に立ちませんが、これらの値を使用して、コピーまたは名前変更と見なされるために必要な類似度を調整できます。あなたのマイレージは異なる場合があります。
「受け入れられた」答えがありますが、それは質問に答える方法についてのヒントを与えません。
git-log(1)とgit-diff(1)からの正解は次のとおりです。
--no-renames
Turn off rename detection, even when the configuration
file gives the default to do so.
コミットの直前に「gitが狂ったことに気分が悪い」場合は、名前を変更したと思ったあいまいなファイルgitの追加を元に戻し、コミットを実行してから、あいまいなファイルをもう一度追加してコミットします。
git reset ambiguous_file_git_thought_you_renamed
git commit
git add ambiguous_file_git_thought_you_renamed
git commit
これは私のために働いた。
名前の変更が行われていないことを再確認してください。
git diff --name-status -C HEAD^^ HEAD
M ambiguous_file_git_thought_you_renamed
M original_file
最初の「M」は変更されたことを意味し、「R」は名前が変更されたことを意味します。ここにRenamedが存在しないことに注意してください。
ファイルA、B、およびCを変更した場合。ファイルD、E、Fを削除しました。gitがDの名前がAなどに変更されたと考える可能性があります。
最も簡単な解決策は、ファイルの変更と削除を2つのコミットに分割することです。