Ответ 1
С Git client 2.16 и выше теперь есть гораздо более простой способ сделать это. Просто используйте git add --renormalize.
Я клонировал репозиторий, у которого были несогласованные окончания строк. Я добавил .gitattributes
, который устанавливает текстовый атрибут для файлов, которые я хочу нормализовать. Теперь, когда я совершаю изменения, я получаю сообщение:
warning: CRLF will be replaced by LF in FILE.
The file will have its original line endings in your working directory.
Как я могу сделать git нормализовать мою рабочую копию файла для меня? Желательно, чтобы git нормализовал все рабочее дерево.
С Git client 2.16 и выше теперь есть гораздо более простой способ сделать это. Просто используйте git add --renormalize.
Для тех, кто использует v2.16 или выше, вы можете просто использовать:
git add --renormalize . # Update index with renormalized files
git status # Show the files that will be normalized
git commit -m "Introduce end-of-line normalization"
Эти направления прямо из gitattributes. Для более старых версий документы (до v2.12) дают другой ответ:
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 (с 2.12 по 2.14) показывают новый набор инструкций (после редактирования файлов .gitattributes):
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 за указание на это.
Кроме того, при любом решении файлы в вашей рабочей копии по-прежнему сохраняют свои старые окончания строк. Если вы хотите обновить их, убедитесь, что ваше рабочее дерево чистое и используйте:
git rm --cached -r .
git reset --hard
Теперь окончания строк будут правильными в вашем рабочем дереве.
Убедитесь, что у вас нет ожидающих изменений в репозитории:
$ 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) вы можете даже очистить всю историю проекта.
Используйте с максимальной осторожностью, на новом клоне. Свяжитесь с кем-нибудь, у кого может быть клон, и сообщите им, что вы хотите сделать.
Опция * text = auto в .gitattributes оставляет репозиторий Git в "недопустимом состоянии", если он содержит файлы с окончаниями строк CRLF (Windows), которые теперь помечены как текст (см. Https://marc.info/?l=git&m = 154484903528621 & w = 2). Стандартный параметр перенормировки не работает корректно с фильтрами LFS, поэтому инструкции в других ответах или, например, на https://help.github.com/en/articles/dealing-with-line-endings, работают неправильно, Вместо этого эти шаги работали для нас:
Ситуация:
Также изменил -crlf на -text для отслеживаемых файлов LFS, но не уверен, что это необходимо.