Как заставить git проверять основную ветвь и удалять возврат каретки после нормализации файлов с помощью атрибута «текст»?

104

Хорошо, поэтому я добавил файл .gitattributesс такими строками

*.css text
*.js text
etc...

Затем я выполнил инструкции на http://git-scm.com/docs/gitattributes#_checking-out_and_checking-in

$ 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"

Но теперь в моей рабочей копии остались символы возврата каретки! У меня есть неотслеживаемые файлы, которые я хотел бы сохранить. Как мне снова получить git checkout из основной ветки с нормализованными файлами?

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

Джейсон
источник

Ответы:

267

Ах ах! Проверьте предыдущую фиксацию, затем проверьте мастер.

git checkout HEAD^
git checkout -f master
Джейсон
источник
5
Спасибо за этот обходной путь, но в git есть явная проблема, заключающаяся в том, что "checkout -f" на самом деле не вызывает повторной проверки. Еще одна проблема - сначала удалить все файлы рабочих копий (то есть все, кроме .git dir).
pfalcon
Ах да, спасибо за это! Услышав это, я предполагаю, что мы могли бы просто удалить интересующие файлы и запустить проверку. Для меня на самом деле был только один файл, который я пытался исправить. Но, конечно, это могут быть все файлы, сотни или тысячи.
Джейсон
Это не удается в git 1.8.3 (mac) с: error: pathspec 'HEAD ^' не соответствует ни одному файлу (файлам), известным git.
dval
@dval, просмотрите правки к этому сообщению, и вы увидите альтернативный способ сделать это. Я тоже работаю на Mac, и у меня это сработало. Я также рекомендую вам обновить свой git до 2+, и вы можете использовать Homebrew, чтобы сделать это безопасным и поддерживаемым способом.
Джейсон
2
Это действительно не работает. GIT будет обновлять только те файлы, которые изменились между двумя фиксациями (за некоторыми исключениями). Если репозиторий новый, например. только две фиксации, и первая оказывается пустой, тогда это решение будет работать. В противном случае вам нужно принудительно удалить все файлы, как описано в ответе mechsin.
jstine 06
16

Как указывали другие, можно просто удалить все файлы в репо, а затем проверить их. Я предпочитаю этот метод, и это можно сделать с помощью кода ниже

git ls-files -z | xargs -0 rm
git checkout -- .

или одна строка

git ls-files -z | xargs -0 rm ; git checkout -- .

Использую постоянно и минусов пока не нашел!

Для некоторого дальнейшего объяснения, -zдобавляет нулевой символ в конец каждой записи, выводимой с помощью ls-files, и -0сообщает, xargsчтобы ограничить вывод, который он получал, этими нулевыми символами.

мехсин
источник