Как отменить все изменения пробелов с помощью git

У меня есть git repo, где я заменил много файлов локально.

Статус

git теперь показывает много многих измененных файлов.

Некоторые из них "действительно изменены", другие отличаются только концами строк.

Я хочу, чтобы те, которые отличаются только концами строк, уходят (git reset), но Кажется, я не могу найти linux-piping-foo, чтобы это произошло.

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

Ответ 1

Это будет сделано:

  git diff -b --numstat \
| egrep $'^0\t0\t' \
| cut -d$'\t' -f3- \
| xargs git checkout HEAD --
  • Запустите разницу рабочей копии с индексом и дайте машиночитаемое резюме для каждого файла, игнорируя изменения в пробеле.
  • Найдите файлы без изменений в соответствии с diff -b.
  • Возьмите их имена.
  • Передайте их git checkout против кончика ответвления.

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

Возможно, полезная альтернатива последней строки:

| git checkout-index --stdin

Это приведет к reset файлам к их поэтапному содержимому, а не к их последнему зафиксированному состоянию.

Вместо этого вы можете использовать git diff HEAD в первой строке, чтобы получить разницу между рабочей копией и последней фиксацией вместо индекса.


Примечание: если в них есть имена файлов с пробелами, сначала нужно добавить tr:

  git diff -b --numstat \
| egrep $'^0\t0\t' \
| cut -d$'\t' -f3- \
| tr '\n' '\0' \

Затем вы должны добавить переключатель -0/-z в любую конечную команду, которую вы хотели использовать:

| xargs -0 git checkout HEAD --
# or
| git checkout-index --stdin -z

Ответ 2

Пользователи Windows - не отчаивайтесь!

git diff -b --numstat \
| egrep $'^0\t0\t' \
| cut -d$'\t' -f3- \
| xargs git checkout HEAD --
  1. Вверх Ответ Аристотеля Пагальциса.