Как нормализовать рабочие окончания линий деревьев в 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) вы даже можете очистить полную историю проекта.
используйте с предельной осторожностью, на свежем клоне. Входить контакт с кто-нибудь у кого может быть клон, и посоветуйте им, что вы хотите сделать.