Как я могу помешать git думать, что я сделал переименование


у меня есть два файла index.html и template.html. Я переехал большую часть index.html на template.html и теперь git думает, что я сделал переименование, когда я добавляю оба файла. Можно ли предотвратить это в конкретных случаях?

4 55

4 ответа:

есть" принятый " ответ, но он не дает никакого намека на то, как ответить на вопрос.

правильный ответ, из 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 будет думать, что вы скопировали или переименовали файл. Если Вы читаете git-log(1), вы узнаете:

индекс сходства-это процент неизмененных строк, а индекс несходства-это процент измененных строк. Это округленное вниз целое число, за которым следует знак процента. Индекс подобия таким образом, значение 100% зарезервировано для двух одинаковых файлов, а 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 сошел с ума", то просто отмените добавление неоднозначного файла, который 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 " означает переименованный. Обратите внимание, что здесь нет переименованных.

чтобы обойти git, думая, что это переименование в фиксации "один".

  1. этап и зафиксировать изменения, которые не вызывают ошибочное переименование
  2. Stage оставшиеся файлы, которые заставили git думать, что это переименование и фиксация с git commit --amend