Моя процедура работы с окончаниями строк следующая (битва проверена на многих репо):
При создании нового репо:
- поместите
.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 помечает многие файлы как измененные.
Решение состоит в том, чтобы сделать поддельный коммит (git add -A . && git commit -m 'fake commit'
) и затем git rebase master
. После перебазировки фальшивый коммит должен исчезнуть.