Git: самодельный файл имеет проблемы с окончанием строки


Итак, у меня есть новое РЕПО, где я пытаюсь начать совместный проект. Я уже подтолкнул к нему файлы .gitignore и .gitattributes (Обработка auto-crlf).

Мой .gitattributes файл:

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.mdj binary

Я создал репозиторий на GitHub и клонировал его на свой ПК через SourceTree. Теперь я пытаюсь создать новый проект CLion внутри него, но когда я пытаюсь добавить CMake и main.c файлы, которые будут зафиксированы, я получаю ошибку LF to CRLF:

The following problems have occurred when adding the files:
fatal: LF would be replaced by CRLF in tpCuat/CMakeLists.txt
 during executing git "C:Program FilesGitcmdgit.exe" -c core.quotedpath=false add --ignore-errors -- tpCuat/CMakeLists.txt

Дело в том, что эти файлы создаются в Windows by me (CLion, на самом деле), поэтому я не могу понять, почему эта ошибка возникает.

1 2

1 ответ:

Это предупреждение (или ошибка) означает именно это: у вас есть linefeed в вашем файле (\n, ASCII 10), и у вас есть конфигурация, которая говорит Git, что он должен выполнять преобразования CRLF. В данном случае это ваш .gitattributes:

* text=auto

Это проблема, потому что Git говорит вам, что он не может гарантировать, что файл, который вы помещаете в, будет тем файлом, который вы позже получите из.

Когда вы добавляете этот файл в свой репозиторий (git add), то Атрибут text=auto говорит Git конвертировать все CRLF (\r\n, ASCII 13, за которым следует ASCII 10) в файле в голую строку (\n, ASCII 10), когда он сохраняет ее в репозитории. Когда Git впоследствии попытается поместить файл на диск (git checkout), то он преобразует все linefeeds (\n) в файле в CRLF (\r\n) по мере его записи.

Когда вы помещаете в файл голый файл linefeed, но говорите Git, чтобы он сделал преобразование CRLF,он не может обойти это. Рассмотрим, есть ли у вас какой-то файл (окончания строк иллюстрированный):

line one\r\n
line two\r\n
line three accidentally ends with a newline!\n
line four\r\n

Теперь, когда Git добавляет Это в репозиторий, он будет выполнять преобразование CRLF и хранить:

line one\n
line two\n
line three accidentally ends with a newline!\n
line four\n

И когда он идет, чтобы проверить его снова:

line one\r\n
line two\r\n
line three accidentally ends with a newline!\r\n
line four\r\n

Обратите внимание, как Третья строка теперь заканчивается CRLF (\r\n), когда его не было в исходном файле? Это то, о чем Git предупреждает вас здесь. Он говорит вам, что он не может точно вернуть вам то, что вы вкладываете.

Если это проблема для вас, то вы должны включить core.safecrlf так что Git будет ошибка, когда это произойдет, и потребует, чтобы вы исправили свои проблемы с окончанием строки. В противном случае, если вам все равно, вы можете спокойно игнорировать это предупреждение.

Почему Клион вообще делает что-то глупое, например, помещает голую строку в ваш файл? Ну, это уже совсем другой вопрос!