Моя процедура работы с окончаниями строк следующая (битва проверена на многих репозиториях):
При создании нового репо:
- положить
.gitattributes
в самый первый коммит вместе с другими типичными файлами, как .gitignore
иREADME.md
При работе с существующим репо:
- Создать / изменить
.gitattributes
соответственно
git commit -a -m "Modified gitattributes"
git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
-n
( --no-verify
это пропустить предварительную фиксацию хуков)
- Я должен делать это достаточно часто, чтобы я определил его как псевдоним
alias fixCRLF="..."
- повторите предыдущую команду
- да, это voodoo, но обычно мне приходится запускать команду дважды, первый раз нормализует некоторые файлы, второй - еще больше файлов. Как правило, лучше повторить, пока не будет создан новый коммит :)
- переходите назад и вперед между старой (непосредственно перед нормализацией) и новой веткой несколько раз. После переключения ветки, иногда git находит еще больше файлов, которые нужно перенормировать!
В .gitattributes
Заявляю все текстовые файлы в явном виде как имеющие LF EOL , так как в целом для Windows инструмент совместим с LF , а не-Windows инструменты не совместим с CRLF (даже многие nodejs инструменты командной строки Предположим , LF и , следовательно , могут изменить EOL в файлах).
Содержание .gitattributes
Мой .gitattributes
обычно выглядит так:
*.html eol=lf
*.js eol=lf
*.json eol=lf
*.less eol=lf
*.md eol=lf
*.svg eol=lf
*.xml eol=lf
Чтобы выяснить, какие отдельные расширения отслеживаются Git в текущем репо, посмотрите здесь
Проблемы после нормализации
Как только это будет сделано, есть еще одна распространенная оговорка.
Скажите, что вы master
уже обновлены и нормализованы, а затем вы оформляете заказ outdated-branch
. Довольно часто сразу после проверки этой ветки git помечает многие файлы как измененные.
Решение состоит в том, чтобы сделать фиктивный commit ( git add -A . && git commit -m 'fake commit'
) и затем git rebase master
. После перебазировки фальшивый коммит должен исчезнуть.