Конфигурация WSL git EOL, игнорирующая атрибуты gitattributes? - PullRequest
0 голосов
/ 28 июня 2018

Я использую подсистему Windows для git для Linux (версия 2.17.1), чтобы управлять репозиторием на моем ноутбуке с Windows, но это доставляет мне головную боль с настройками конца строки.

Контекст

Из того, что я могу понять об управлении EOL в git (поправьте меня, если / где я ошибаюсь), есть две ключевые области, которые управляют этим:

  • .gitconfig, где core.autocrlf и core.eol устанавливают общую политику
  • .gitattributes, где я могу указать атрибуты для каждого пути eol и text.

Из этого вопроса Я узнал, что настройка core.autocrlf = true эквивалентна настройке core.eol = crlf и добавлению атрибута text=auto к каждому файлу; и что атрибут eol= переопределяет конфигурацию core.eol.

После этого я настроил небольшой тест, чтобы выяснить, какие опции мне нужны.

Что я пытаюсь получить и что я пытался

В моем репозитории у меня будут некоторые файлы, используемые только на стороне Windows, некоторые - только на машинах UNIX, и источник, который будет использоваться обоими. Чтобы избежать головной боли, я хочу установить для всех файлов только для Windows значение , всегда с CRLF EOL, а при фиксации все остальное - в LF.

Чтобы сделать это, я решил установить .gitattributes строку *.vcxproj eol=crlf text и покончить с этим. Для большей уверенности, просто чтобы быть в безопасности, я также подумал добавить *.sh eol=lf text. Наконец, я придумал небольшой тест, чтобы проверить, работает ли он на самом деле (Спойлер: это не так).

Тестовая настройка

Мое дерево каталогов выглядит следующим образом:

root_dir/
    - real.sh       (has LF EOL)
    - real.vcxproj  (has CRLF EOL)
    - fake.sh       (has CRLF EOL)
    - fake.vcxproj  (has LF EOL)
Файлы

real.* имеют «правильный» EOL для своего типа, fake.* - другой. Цель состоит в том, чтобы проверить, какие файлы поднимают warning, когда git add -ing их в хранилище.

git config -l показывает:

core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.ignorecase=true

В идеале, если все работает так, как я понял, «поддельные» файлы вызывают предупреждение, преобразуемое в противоположный тип.

Вместо этого происходит следующее:

$ git add -A
warning: CRLF will be replaced by LF in fake.sh.
The file will have its original line endings in your working directory.
warning: CRLF will be replaced by LF in real.vcxproj.
The file will have its original line endings in your working directory.

Пытаясь понять, почему это происходит, кажется, что преобразование выбирает конфигурацию core.eol (по умолчанию LF в системе UNIX) и игнорирует то, что я указал в .gitattributes. Чтобы проверить эту гипотезу, я установил core.eol = crlf, сбросил индекс и затем git add -A снова, на этот раз получив:

$ git add -A
warning: LF will be replaced by CRLF in fake.vcxproj.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in real.sh.
The file will have its original line endings in your working directory.

Гипотеза подтверждена, головная боль усилилась. Почему мои eol=... атрибуты игнорируются? Есть ли способ настроить автоматическое преобразование для каждого типа файла? Если да, то как?

1 Ответ

0 голосов
/ 03 июля 2018

После дальнейших тестов кажется, что некоторые невидимые символы попали в мой файл .gitattributes, нарушая атрибут eol=.... Создание файла с помощью cat "..." > .gitattributes устранило проблему.

...