Git фиксирует неправильные символы новой строки при использовании .gitattributes

У меня была проблема, когда конфликты слияния приводили к конфликту всего файла. Это закончилось тем, что все новые строки локального файла стали новыми строками в стиле unix (LF) во время слияния (до слияния и разработка, и функциональная ветвь имели новые строки CRLF при извлечении).

Если бы я побежал

git rm --cached -r .
git add -A

никакие изменения не будут отображаться со статусом git. Но когда я удалил файл .gitattributes и сделал еще одно удаление всего / добавление всего, это привело к тому, что некоторые файлы были обновлены разными новыми строками. Например, для файла из 100 строк будет указано, что 100 строк удалено, 100 добавлено. После этого для обеих ветвей слияния прошли нормально.

.gitconfig autocrlf = true был установлен, а файл .gitattributes содержал только эти строки. Я думаю, что приведенные ниже строки повлияют только на стратегию слияния.

*.csproj -text merge=union
*.sln -text merge=union

Почему этот атрибут .gitattributes может изменить способ фиксации новых строк?

Кроме того, если для autocrlf установлено значение true, я не уверен, почему слияние будет сравнивать LF и CRLF, если, возможно, что-то в .gitattributes не переопределяет его.


Из https://help.github.com/articles/dealing-with-line-endings

При желании вы можете настроить способ, которым Git управляет окончаниями строк для каждого репозитория, настроив специальный файл .gitattributes. Этот файл фиксируется в репозитории и переопределяет индивидуальную настройку core.autocrlf, обеспечивая согласованное поведение для всех пользователей, независимо от их настроек Git. Преимущество файла .gitattributes в том, что ваши конфигурации строк связаны с вашим репозиторием.

Это дает понять, что .gitattributes способен переопределять autocrlf, но в нем нет настроек, которые говорят ему выполнять какое-либо преобразование eol. Возможно, есть какое-то значение по умолчанию, которое неявно используется.


person Despertar    schedule 03.09.2014    source источник


Ответы (1)


Я понимаю, что это старый вопрос, но ответ может быть полезен для тех, у кого есть связанная проблема.

В файле gitattributes указывается "-text" для файлов *.csproj и *.sln. Это означает, что для этих файлов не следует выполнять преобразование EOL.

С другой стороны, вы также использовали конфигурацию «autocrlf = true». Этот параметр означает: хранить файлы с окончаниями строк LF в репозитории Git и хранить файлы с окончаниями строк в рабочем каталоге.

Итак: перед добавлением файла gitattributes файлы *.csproj и *.sln сохраняются с окончаниями строк LF в репозитории Git из-за настройки autocrlf. После добавления файла gitattributes и проверки этих файлов в рабочем каталоге преобразование EOL не выполняется, и эти файлы заканчиваются строками LF в рабочем каталоге.

person rvdginste    schedule 03.03.2015