Git core.safecrlf различное поведение в файлах с одинаковыми окончаниями строк
у меня есть машина Windows с VS project, и я использую как Visual Studio, так и инструменты из среды Cygwin, включая Git. Иногда я получаю разные окончания строк в файлах после редактирования. Я хочу, чтобы простое решение проверяло согласованность строк файлов, прежде чем они перейдут в репо. В Git core.safecrlf
это правильная вещь, я полагаю.
Теперь у меня странное поведение:
файлы A
и B
со следующими параметрами:
$file A
A: HTML document, UTF-8 Unicode text, with CRLF line terminators
$file B
B: HTML document, UTF-8 Unicode (with BOM) text, with CRLF line terminators
файл A уже находится в репо, файл B это новый. Обратите внимание, что оба имеют окончания строк CRLF. Теперь попробуй поставить их,core.safecrlf
и true
.
$git add A # ok
$git add B # fails
fatal: CRLF would be replaced by LF in B.
С core.safecrlf
правильно? Или, может быть, мне нужно написать крюк, чтобы проверить файлы?
Примечания:
- пробовал с разными кодировками файлов (с и без спецификации), без разницы.
- есть связанные
core.autocrlf
функция в Git, добавила его в теги (Stackoverflow не имеет тега дляcore.safecrlf
) - git версия 1.8.5.ник1.17.g0ecd94d (скомпилировано из источников под Cygwin)
EDIT #1: проверено core.autocrlf
- это input
. Изменено на false
, теперь я могу добавлять файлы. Почему?
2 ответов
согласно вашему более позднему редактированию core.autocrlf = input
была первоначальная настройка. С этой настройкой CRLF
превращается в LF
при регистрации в репозитории и так и держится когда проверили. Это означает, что редактор без Unix-строк, такой как Notepad, испортит внешний вид проверенной версии файла. Это будет одна гигантская длинная очередь.
чистки рядов core.autocrlf = input
является предпочтительным параметром в системах Unix и использует значение по умолчанию cygwin
построить, наверное пусть будет так. В Windows рекомендуемыми настройками являются core.autocrlf = true
что msysgit
рекомендует
core.safecrlf = true
прерывает преобразование файла, если проверка файла приведет к изменению и, возможно, поврежденному файлу, который будет иметь место, если Notepad был редактором. Вот почему файл B был прерван, потому что он был бы перепутан в Редакторе, таком как блокнот. Разница между core.SAFEcrlf
и core.AUTOcrlf
следует отметить. Это один из eyes glazing over
проблемы в понимании git
окончание строки
core.autocrlf = false
это не волнует режим. Он будет проверять и проверять файлы точно так, как они есть, поэтому коммиты теперь работают. Это не очень умно и не рекомендуется, потому что это вызывает проблемы, если файлы редактируются в системах Windows и Unix, а также если другие пользователи core.autocrlf
настройки отличаются и изменяют окончания файлов.
мое собственное предпочтение-установить core.autocrlf
to input
на Windows, если все Редакторы Windows и другие инструменты обработки текстовых файлов в проекте-Unix line ending aware, в противном случае установите его в core.autocrlf = true
для Windows и core.autocrlf = input
для Unix. В любом случае этот подход устарел благодаря превосходному методу
выбор окончания линии CR LF не так легко понять. Есть два места для описаний в том, что он охвачен как в руководствах Git-attributes, так и в руководствах git-config.
первоначально были настройки autocrlf, а затем появились новые версии, которые имеют некоторые потенциальные несовместимости (т. е. делают неожиданные вещи, как вы указываете).
Я склонен устанавливать eol=LF, что делает все текстовые файлы фиксированными как окончания строк LF (вы можете установить атрибуты о том, какие файлы считаются текстовыми), а затем добавьте safecrlf для проверки туда и обратно.