Заставьте Git использовать CRLF в строках слияния <<<<<<< HEAD
Можно ли попросить Git использовать CRLF вместо LF в конце строк, которые он помещает в файл, когда ему нужно объединить?
Если разрешение конфликтов в текстовом редакторе выполняется без видимых символов EOL, то легко получится, что эти LF будут объединены, если вы удалите выбор:
Оставив вас с:
И теперь два LF проникли в ваш файл CRLF!
Очевидно, что одна альтернатива - просто уделять больше внимания окончанию строк при разрешении слияний, но я подумал, что могу спросить, есть ли способ указать Git использовать CRLF для строк, которые он генерирует здесь.
3 ответа
Можно ли попросить Git использовать CRLF вместо LF в конце строк, которые он помещает в файл, когда ему нужно объединить?
Это... на самом деле возможно, начиная с git 2.7.2+ (февраль 2016 года).
И вам не нужно ничего делать.
Смотрите коммит 15980de, коммит 86efa21 (27 января 2016 г.) от Johannes Schindelin ( dscho
)
(Объединено Юнио С Хамано - gitster
- в коммите ab2c107, 17 февраля 2016 г.)
merge-file
: пусть маркеры конфликта соответствуют стилю конца строкиПри объединении файлов с окончаниями строк CR/LF маркеры конфликта должны совпадать с ними, чтобы выходной файл не имел смешанных окончаний строк.
Это особенно интересно в Windows, где некоторые редакторы действительно запутаны смешанными окончаниями строк.
Уважаемая оригинальная версия этого патча от Beat Bolli
core.eol
и последующее улучшение этого разработчика также уважаетсяgitattributes
,
Этот подход был неоптимальным, хотя:git merge-file
был изобретен в качестве замены для слияния GNU и поэтому не имеет никаких проблем при работе вне любого репозитория!Еще одна проблема, связанная с оригинальным подходом, была отмечена Джунио Хамано: в старых репозиториях могут храниться текстовые файлы с использованием окончаний строк CR/LF (и
core.eol
иgitattributes
даст нам ложное впечатление там). Следовательно, гораздо лучший подход - просто сопоставить окончания строки контекста, если таковые имеются.На самом деле нам вообще не нужно смотреть на весь контекст:
- если файлы все LF-only или все они имеют окончания строк CR/LF, достаточно взглянуть только на одну строку, чтобы соответствовать этому стилю.
- И если концовки строк в любом случае смешаны, все равно можно имитировать только один конец строки: мы просто добавим к куче смешанных концов строк, и мы ничего не можем с этим поделать.
Итак, что мы делаем: мы смотрим на строку, предшествующую конфликту, возвращаясь к строке, предшествующей этой, в случае, если это была последняя строка и у которой не было конца строки, возвращаясь к первой строке, первой в первом пост-изображении, затем второй пост-образ и, наконец, предварительный образ.
Если мы находим согласованный стиль конца строки CR/LF (или не определен), мы сопоставляем его, в противном случае мы используем LF-окончания только для маркеров конфликта.Обратите внимание, что хотя верно, что мы должны рассматривать как минимум две строки (в противном случае не было бы никакого конфликта), это не относится к окончанию строк: все три рассматриваемых файла могут состоять из одной строки без любой конец строки, каждый. В этом случае мы вернемся к использованию только LF.
Нет настройки, которая контролирует окончания строк, используемые для маркеров "<<<<" в git; они жестко запрограммированы для использования '\n'
в исходном коде git (см. строку 173 файла xmerge.c).
Если вы установите "eol
" или же "core.eol
"настройки для"crlf
", то маркеры"<<<< "будут иметь \r\n
окончания строк в файле (это происходит на этапе фильтра smudge/clean после кода, приведенного выше), но это имеет основной побочный эффект: файлы будут "нормализованы" по пути в хранилище, поэтому вы будете фиксировать файлы с окончанием строки Unix.
Скорее всего, это не то, что вы хотите в.Net проекте, как в примере выше.
Так что у меня нет хорошего ответа для вас, извините.
Я не уверен, существует ли глобальный способ сделать это, но вы можете установить символ EOL по умолчанию для каждого расширения файла в файле.gitattributes (см. Раздел Конец строки в документации по gitattributes).
Например, отредактируйте файл.gitattributes в корне проекта git, чтобы он содержал что-то вроде этого:
*.cs eol=crlf
*.config eol=crlf