Як змусити git перевірити головну гілку та видалити повернення каретки після нормалізації файлів за допомогою атрибута “text”?


101

Гаразд, я додав файл .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 головну гілку з нормалізованими файлами?

Я знаю, що файли нормалізуються у сховищі, тому що коли я клоную репо, у мене є всі файли без повернення каретки.

Відповіді:


264

Ах ах! Оформити попередній коміт, а потім перевірити майстер.

git checkout HEAD^
git checkout -f master

5
Дякуємо за цей обхідний шлях, але кричуща проблема в git, що "checkout -f" насправді не змушує повторно оформляти замовлення. Ще однією помилкою було б спочатку видалити всі робочі файли копій (тобто все, крім каталогу .git).
pfalcon

Ах, так, дякую за це! Почувши це, я припускаю, що ми могли б просто видалити цікаві файли та запустити замовлення. Для мене насправді був лише один файл, який я намагався виправити. Але, звичайно, це можуть бути всі файли, сотні чи тисячі.
Джейсон,

Це не вдається на git 1.8.3 (mac) з: error: pathspec 'HEAD ^' не відповідає жодному файлу (файлам), про який відомо git.
dval

@dval, подивись редагування цього допису, і ти побачиш альтернативний спосіб зробити це. Я теж працюю на Mac, і це спрацювало для мене. Я також закликаю вас оновити ваш git до 2+, і ви можете використовувати Homebrew, щоб зробити це безпечним способом, який можна підтримувати.
Джейсон

2
Це насправді не працює. GIT буде оновлювати лише файли, які змінювались між двома комітами (за деякими винятками). Якщо сховище новеньке, напр. лише дві коміти, і перша виявляється порожньою, тоді це рішення спрацює. В іншому випадку потрібно примусово видалити всі файли, як описано у відповіді mechsin.
jstine

16

Як зазначали інші, можна просто видалити всі файли в репозиторії, а потім перевірити їх. Я віддаю перевагу цьому методу, і це можна зробити за допомогою коду нижче

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

або один рядок

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

Я використовую його весь час і ще не знайшов жодної сторони!

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.