#git #rebase #line-endings
#мерзавец #перебазирование #окончания строк
Вопрос:
Я пытаюсь перебазировать ветвь, содержащую фиксацию, которая исправляет окончания строк некоторых файлов (делая их LF вместо CRLF). Если я попытаюсь сделать обычную перебазировку
git rebase origin/develop
Я получаю множество конфликтующих строк в фиксации, следующей за фиксацией конца строки, потому что окончания строк изменились, поэтому git думает, что изменилась каждая строка. Но если я попытаюсь вместо этого
git rebase -s recursive -Xignore-space-at-eol origin/develop
это происходит:
dropping f0eddc9f4244fb7ebdf9b3f514f875f6b34fb4b7 Fix line endings -- patch contents already upstream
Как я могу заставить git игнорировать изменения в конце строки для целей объединения, но не при проверке необходимости исправления?
Ответ №1:
Я придумал решение. Главное-изменить параметры стратегии слияния во время перебазирования. Это официально не поддерживается, поэтому используйте эту технику на свой страх и риск!
- Запустите интерактивную перебазировку (сначала прервите любую ранее предпринятую перебазировку).
- Вставьте строку «разрыв» после фиксации, которая исправляет окончания строк в файле задач перебазирования.
- Внесите любые другие изменения, необходимые для перебазирования файла задач, если таковые имеются, и продолжайте перебазирование.
- Когда вы дойдете до фиксации конца строки, если в ней есть конфликт, разрешите конфликт, введя:
git diff --name-only --diff-filter=U gt; changed-files xargs -a changed-files git checkout --ours -- xargs -a changed-files dos2unix xargs -a changed-files git add rm changed-files git rebase --continue
- Когда перебазирование git останавливается сразу после фиксации окончаний строк, измените стратегию слияния и продолжайте:
echo recursive gt; .git/rebase-merge/strategy echo ' --ignore-space-at-eol' gt; .git/rebase-merge/strategy_opts git rebase --continue
- Продолжайте перебазирование в обычном режиме.