как отменить все пробельные изменения с помощью git - PullRequest
38 голосов
/ 27 октября 2010

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

Состояние git теперь отображает множество измененных файлов.

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

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

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

Ответы [ 3 ]

45 голосов
/ 27 октября 2010

Это сделает это:

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

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

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

| git checkout-index --stdin

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

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


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

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

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

| xargs <b>-0</b> git checkout HEAD --
# or
| git checkout-index --stdin <b>-z</b>
2 голосов
/ 15 декабря 2016

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

  1. Установите bash на Ubuntu в Windows .
  2. Откройте Bash в Ubuntu в Windows Командная строка.
  3. Смонтируйте диск с репо.Чтобы получить доступ к диску C, выполните cd /mnt/c.
  4. Перейдите в каталог репозитория: cd repos/my-project
  5. Выполните команду из Невероятный ответ Аристотеля Пагальтзиса :
git diff -b --numstat \
| egrep $'^0\t0\t' \
| cut -d$'\t' -f3- \
| xargs git checkout HEAD --
Upvote Ответ Аристотеля Пагальциса .
0 голосов
/ 18 апреля 2018

Хотя кажется, что вы изначально искали решение на основе канала и получили его от @ aristotle-pagaltzis, так как его немного сложно запомнить, я думаю, что этот вариант стоит отметить:

git diff -b > gitdiffb
git stash  # or git reset --hard if you feel confident
git apply --ignore-space-change gitdiffb

Если необходимо игнорировать не только изменения чисел пробелов, но и совершенно новые или полностью удаленные пробелы, замените -b на -w.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...