Игнорировать * все * изменения пробелов с помощью git-diff между коммитами

Я просматриваю кодовую базу и исправляю странности с пробелами и в целом исправляю отступы и тому подобное, и я хочу убедиться, что я случайно не внес никаких других изменений, поэтому я делаю git diff -w, чтобы отображать различия во всех измененных файлах, игнорируя различия в пробелах. Проблема в том, что при этом фактически не игнорируются все различия в пробелах - по крайней мере, то, что я считаю просто различиями в пробелах. Например, в следующем выводе git diff -w,

-"Links":
-{
-
-    "Thermal":
-
-{
-
+  "Links": {
+    "Thermal": {

вы можете видеть, что я только

  1. убраны лишние пустые строки,
  2. поставить фигурные скобки в конце строки ключа, значение которого они открывают, и
  3. отступ, чтобы соответствовать контексту

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


person iconoclast    schedule 15.10.2015    source источник
comment
Для пользователей Bitbucket есть предлагаемое исправление для этого, но оно еще не было закодировано и, вероятно, не будет, пока не проявит достаточный интерес. Вы можете зайти на сайт Bitbucket и выразить свою поддержку. Первоначально я нашел текущую страницу при поиске решения в Bitbucket, поэтому, если в этой ситуации есть другие, перейдите по ссылке здесь и голосуйте!   -  person paultamalunas    schedule 02.05.2018
comment
git difftool + kdiff3 - один из вариантов   -  person Tim Abell    schedule 18.03.2019


Ответы (2)


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

Во-первых, вы должны контролировать определение «пробела», которое в настоящее время использует Git.

git config core.whitespace '-trailing-space,-indent-with-non-tab,-tab-in-indent'

Затем вы должны контролировать определение используемого слова. Вместо простого использования git diff -w добавьте --word-diff-regex='[^[:space:]]':

git diff -w --word-diff-regex='[^[:space:]]'

Вы по-прежнему будете видеть контекст, который (в моем случае, поскольку я пытаюсь убедиться, что нет различий кроме различий в пробелах) бесполезен. Вы можете использовать -U0, чтобы указать Git дать вам 0 строк контекста, например,

git diff -w -U0 --word-diff-regex='[^[:space:]]'

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

Вы также можете сделать все вышеперечисленное одной командой. Флаг -c изменяет конфигурацию git только для одной команды.

git -c core.whitespace=-trailing-space,-indent-with-non-tab,-tab-in-indent diff -U0 --word-diff-regex='[^[:space:]]'
person iconoclast    schedule 15.10.2015
comment
@Torek - еще одна добродетель Git. Почему, черт возьми, так сложно провести различие без пробелов ??? Я нахожусь на машине с Windows, пытаюсь оценить PR для файлов проекта Visual Studio. Меня не волнуют различия CR, LF или CRLF, но это то, чем Git наполняет мой терминал. - person jww; 19.09.2016
comment
и люди не понимают, почему я ненавижу мерзавца - person Gerry; 17.08.2018
comment
В любом случае создать для него псевдоним? - person StR; 05.12.2018
comment
@StR вы можете создать псевдоним в .gitconfig со следующим текстом в разделе [alias]: diffw = diff -w -U0 --word-diff-regex=[^[:space:]] - person mattwright; 07.01.2019
comment
Я получаю сообщение об ошибке: no matches found: --word-diff-regex=[^[:space:]], когда пытаюсь это сделать. Есть предположения? - person NSjonas; 21.09.2019
comment
@NSjonas У меня такая же ошибка. Вам нужно добавить цитаты. Редактировал команды в ответе. - person cambunctious; 15.06.2020

Игнорировать все изменения пробелов с помощью git-diff между коммитами

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

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

Выполните второй клон, а затем проверьте начальную ревизию, о которой идет речь. Затем запустите на них обычный diff, используя вашу текущую ревизию: diff -bur --ignore-all-space <dir1> <dir2>.

Вот некоторые параметры для diff

-i, --ignore-case
       ignore case differences in file contents

-E, --ignore-tab-expansion
       ignore changes due to tab expansion

-Z, --ignore-trailing-space
        ignore white space at line end

-b, --ignore-space-change
       ignore changes in the amount of white space

-w, --ignore-all-space
       ignore all white space

-B, --ignore-blank-lines
       ignore changes where lines are all blank
person jww    schedule 19.09.2016
comment
Ни один из этих вариантов не помогает в этом случае: diff по-прежнему рассматривает разрыв строки как нечто отличное от отсутствия разрыва строки. - person Gilles 'SO- stop being evil'; 21.09.2018
comment
с последней версией git (v2.20.1): error: invalid option: -Z - person Morteza Ziyae; 16.01.2019
comment
@MortezaZiaeemehr параметр предназначен для команды diff, а не для команды git. В этом ответе рекомендуется использовать инструмент diff, а не использовать git для выполнения текущей работы. - person saraf; 26.03.2019
comment
Также были проблемы с недопустимой опцией. --ignore-all-space и --ignore-cr-at-eol работали у меня. - person mix3d; 16.07.2019