Заставьте Git использовать CRLF в строках слияния <<<<<<< HEAD

Можно ли попросить Git использовать CRLF вместо LF в конце строк, которые он помещает в файл, когда ему нужно объединить?

Слияние с использованием LFs

Если разрешение конфликтов в текстовом редакторе выполняется без видимых символов EOL, то легко получится, что эти LF будут объединены, если вы удалите выбор:

Удалить по выбору

Оставив вас с:

LFs красться в файл

И теперь два 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
Другие вопросы по тегам