git rebase отбрасывает фиксацию, содержащую только изменения в конце строки

#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:

Я придумал решение. Главное-изменить параметры стратегии слияния во время перебазирования. Это официально не поддерживается, поэтому используйте эту технику на свой страх и риск!

  1. Запустите интерактивную перебазировку (сначала прервите любую ранее предпринятую перебазировку).
  2. Вставьте строку «разрыв» после фиксации, которая исправляет окончания строк в файле задач перебазирования.
  3. Внесите любые другие изменения, необходимые для перебазирования файла задач, если таковые имеются, и продолжайте перебазирование.
  4. Когда вы дойдете до фиксации конца строки, если в ней есть конфликт, разрешите конфликт, введя:
 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  
  1. Когда перебазирование git останавливается сразу после фиксации окончаний строк, измените стратегию слияния и продолжайте:
 echo recursive gt; .git/rebase-merge/strategy echo ' --ignore-space-at-eol' gt; .git/rebase-merge/strategy_opts git rebase --continue  
  1. Продолжайте перебазирование в обычном режиме.