Git REPO CRLF против конца локальной линии - PullRequest
0 голосов
/ 01 мая 2018

Я работаю с репо, имеющим несколько файлов .C и .H в самом репо с использованием CRLF, в то время как остальные, похоже, используют стандартный LF. Из-за этого «автоматическое» преобразование (которое, как я полагаю, ожидает, что все текстовые файлы будут LF) не затрагивает их. Это приводит к тому, что эти файлы модифицируются с помощью чего-то вроде оттока CRLF.

Если я правильно понимаю, это потому, что GIT ожидает, что рабочее дерево будет LF, потому что он ожидает, что файлы репо будут LF, и не инициировал никакого преобразования, о котором он знал, поэтому CRLF выглядит измененным.

Если все это звучит нормально, тогда мой вопрос - есть ли способ настроить GIT так, чтобы он преобразовывал при извлечении / фиксации этих файлов CRLF-repo'd? В этом конкретном случае это на Mac, так что я собираюсь:

repo CRLF -> working LF
edit LF-file
checkin, going
working LF -> repo CRLF

Исправление исходного CRLF -> LF, вероятно, лучше, но я не управляю репо

1 Ответ

0 голосов
/ 01 мая 2018

Это не совсем верно, но достаточно близко: проблема здесь в том, что Git имеет то, что составляет направленное преобразование . Документация Git не говорит о своих преобразованиях таким образом, но, возможно, так и должно быть.

Может быть полезно думать о файлах, хранящихся в Git, как о «формате Git»: сжатых и, если вы определите clean filter через .gitattributes и вашу конфигурацию, cleaned . Даже если вы не определите конкретный чистый фильтр, если вы настроите преобразования CRLF, Git выполнит здесь некоторую очистку: файлы, хранящиеся в хранилище, будут только для LF. Ожидается, что файлы в вашем рабочем дереве, как вы почти сказали, будут в вашем предпочтительном рабочем формате: не Git-сжатые, с использованием окончаний CRLF , если вы их выбрали, и нечеткое изображение через ваш грязный фильтр , если вы установите один из них (аналогично настройке чистого фильтра).

Это действительно в основном для пользователей Windows, где редакторы и среды Windows имеют своего рода предпочтение для концов строк CRLF. Когда все настроено правильно, рабочие копии файлов, которые используются при работе, имеют окончания CRLF так, как этого хочет Windows, и зафиксированные копии файлов, которые можно использовать только путем извлечения их в рабочие копии, имеют LF- только окончания, как их предпочитает Linux.

Эти преобразования фактически выполняются в то время, когда файлы перемещаются из index - промежуточной структуры, которую Git налагает между коммитами и рабочими деревьями - в рабочее дерево или из рабочего дерева в индекс. Git делает коммиты из того, что находится в индексе, поэтому, «чистя» файлы на пути от рабочего дерева к индексу, Git может зафиксировать чистые версии, а путем уничтожения файлов на пути от индекса к рабочему дереву Git может обеспечить грязные окончания CRLF, которые нравятся Windows.

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

Самый простой подход к решению этой проблемы в любой системе, где CRLF не вредит удобству использования (а это большинство систем), - просто оставить его. Следующий простейший способ - исправить это в репо , но, как вы сказали, для этого требуется контроль над хранилищем.

Если какой-то конкретный файл доставляет вам проблемы из-за его окончаний CRLF, в Git нет ничего встроенного, что переведет его на LF-only в вашем рабочем дереве, затем вернитесь к CRLF, когда вы git add получите результат. Тем не менее, вы можете установить свои собственные пятна и чистые фильтры, которые делают именно это: установите фильтр пятна очистите файл (превратив CRLF в LF-only), и установите фильтр очистки грязным файл (путем преобразования LF-only в CRLF). Затем вы можете настроить файл .gitattributes или .git/info/attributes на , используя эти фильтры для определенных файлов. См. документацию gitattributes для более подробной информации, но по существу:

badfile1.ext    filter=reverse-clean
badfile2.xtn    filter=reverse-clean

вместе с:

[filter "reverse-clean"]
    clean = sed -e $'s/\\r*$/\\r/'
    smudge = sed -e $'s/\\r$//'

(теперь тестируется как драйвер фильтра Git - в приведенном выше примере предполагается, что команда подается на sh -c, а sh интерпретирует $'...'; двойная обратная косая черта связана с тем, что это входит в файл конфигурации).

Как вы заметили в комментарии ниже, есть небольшое раздражение: git diff показывает возврат каретки на измененных строках, но не на окружающих строках, что делает различия немного уродливыми. Это, кажется, работает как хотелось бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...