Правильно удаленная и добавленная папка к переименованию, произошедшему в далеком прошлом - PullRequest
0 голосов
/ 02 января 2019

Я переместил папку projectname/stuff/*.py в projectname/projectname/stuff/*.py, где projectname/.git/ - базовая папка хранилища. Это переименование исходной папки, по-видимому, было зарегистрировано как удаление папки с последующим добавлением вновь созданных файлов, почти (но не совсем) идентичных исходным удаленным файлам. Я не заметил проблемы в то время, и сейчас прошло несколько месяцев и сотни коммитов.

Я больше не могу объединяться или отличаться от изменений других ветвей, существовавших до этого разделения, потому что. Есть ли простой способ исправить это, чтобы я мог объединять изменения из других веток без прохождения и изменения каждого коммита в моей истории?

1 Ответ

0 голосов
/ 02 января 2019

Git явно не хранит ходы (и, соответственно, переименовывает).Вместо этого он всегда записывает удаление одного файла и добавление другого.Он обнаруживает движения и переименовывает, вычисляя сходство файлов, которые были удалены и добавлены.Так что отрадно то, что вам не нужно переписывать свою историю, чтобы выполнить это.

Вместо этого вам нужно указать diff или слияние для поиска переименованных файлов.В diff вы будете использовать флаг --find-renames , а при слиянии вы будете использовать стратегию recursive с набором find-renames параметров .

git diff --find-renames[=<n>] 
git merge -s recursive -Xfind-renames[=<n>] 

Оба могут принимать необязательное значение для выражения того, какими должны быть похожие файлы.По умолчанию это 50%.Вы можете установить это, сделав <n> сходство, которое вы ищете.Например, --find-renames=40%, чтобы сказать, что это совпадение, если хотя бы 40% строк в файле совпадают.Будьте очень осторожны, поднимая его слишком высоко, очень легко получить ложные срабатывания.

Этот параметр обычно включен по умолчанию.Он уже включен, другая частая причина этой проблемы - массовые изменения пробелов в файлах, с которыми вы работаете (изменение конца строки, переходы на пробелы, изменение отступа), которые превышают этот порог в 50%.В этих случаях вы можете вызвать один из параметров управления пробелами (для diff и merge ), чтобы помочь, но это часто требует некоторой очистки после факта, так что вы можете захотетьдобавьте параметр --no-commit для таких слияний, чтобы вы могли устранить любые пробелы перед фиксацией.

...