Как нормализовать рабочие окончания линий деревьев в Git?

Я склонируете репозиторий, которые inconsistend окончаний строк. Я добавил .gitattributes, который устанавливает атрибут text для файлов, которые я хочу нормализовать. Теперь, когда я совершаю изменения, я получаю сообщение:

warning: CRLF will be replaced by LF in FILE.
The file will have its original line endings in your working directory.

Как я могу сделать git нормализовать мою рабочую копию файла для меня? Желательно, чтобы git нормализовал все рабочее дерево.

4 ответов


документы на gitattributes дает ответ:

rm .git/index     # Remove the index to force git to
git reset         # re-scan the working directory
git status        # Show files that will be normalized
git add -u
git add .gitattributes
git commit -m "Introduce end-of-line normalization"

выполните эту последовательность после редактирования .gitattributes.

обновление

похоже, у некоторых пользователей возникли проблемы с приведенными выше инструкциями. Обновленные документы для gitattributes показывают новый набор инструкций (после редактирования .gitattributes files):

git read-tree --empty   # Clean index, force re-scan of working directory
git add .
git status        # Show files that will be normalized
git commit -m "Introduce end-of-line normalization"

спасибо @vossad01 за указание на это.

кроме того, с решением файлы в вашей рабочей копии по-прежнему сохраняют свои старые окончания строк. Если вы хотите обновить их, убедитесь, что ваш рабочее дерево-это чистый!--20--> и использовать:

git rm --cached -r .
git reset --hard

теперь окончания строк будут правильными в вашем рабочем дереве.


с Git client 2.16 и выше теперь есть гораздо более простой способ сделать это. Просто используйте git add --renormalize .


альтернативный подход (отличается только в команду)

убедитесь, что у вас нет ожидающих изменений в репозитории:

$ git status
$ git stash

изменить .gitattributes таким образом, интерпретация CRLF будет изменена:

$ echo "*.txt  text" >>.gitattributes
$ git commit -m "Made .txt files a subject to CRLF normalization." -- .gitattributes

удалить данные из индекса и обновить рабочий каталог:

$ git rm --cached -r .
$ git reset --hard

обзор CRLF исправляет, что Git предлагает:

$ git ls-files --eol
$ git status
$ git diff

согласен с решением Git:

$ git add -u
$ git commit -m "Normalized CRLF for .txt files"

перезагрузить изменения, как если бы чистый клон был сделано:

$ git rm --cached -r .
$ git reset --hard

на .gitattributes настройки будут влиять только на новые коммиты. Если в этом репозитории есть нет история опубликована (нет других в зависимости от него), вы можете пройти через всю историю. В Unix/Linux, вы можете использовать dos2unix(1) исправить все файлы в сочетании с find(1), и используя переписывание истории filter-branch (см. обсуждение в книге git) вы даже можете очистить полную историю проекта.

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