Ігноруйте * усі * пробіли, змінюючи git-diff між комітами


79

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

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

ви бачите, що я лише

  1. видалено зайві порожні рядки,
  2. поставити фігурні дужки в кінці рядка ключа, значення якого вони відкривають, і
  3. з відступом відповідно до контексту

Спочатку це запитання могло дати відповідь, але воно стосується відмінностей між двома конкретними файлами , а не між двома конкретними комітами . Все інше, виявлене пошуками, теж було тупиком. Наприклад, це питання стосується злиття, а не відображення різниць, і це питання стосується відображення різниць на рівні слова тощо.


1
Для користувачів Bitbucket пропонується виправити це, але воно ще не закодовано і, можливо, не буде, поки не буде достатньо інтересу. Ви можете зайти на сайт Bitbucket і показати свою підтримку. Спочатку я знайшов поточну сторінку під час пошуку рішення в Bitbucket, тому, якщо в цій ситуації є інші, будь ласка, йдіть сюди і голосуйте!
paultamalunas,

git difftool+ kdiff3 - один із варіантів
Тім

Відповіді:


68

Можливо, є краща відповідь, але найкращим рішенням, яке я знайшов на даний момент, є це.

По-перше, ви повинні контролювати визначення "пробілів", яке 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:]]'

2
@Torek - ще один шматок доброти Git. Чому, в біса, так складно розрізнятись без усіх пробілів ??? Я працюю на машині Windows, намагаючись оцінити PR у файлах проектів Visual Studio. Мені байдуже до різниць CR, LF або CRLF, але цим Git наповнює мій термінал.
jww

2
і люди не розуміють, чому я ненавиджу git
Геррі,

У будь-якому разі створити для нього псевдонім?
StR

2
@StR ти можеш створити псевдонім у .gitconfigнаступному у своєму [alias]розділі: diffw = diff -w -U0 --word-diff-regex=[^[:space:]]
mattwright

1
@NSjonas Я отримав ту ж помилку. Вам потрібно додати лапки. Я редагував команди у відповіді.
камбунктивний

34

Ігноруйте всі зміни пробілів за допомогою git-diff між комітами

Спочатку це запитання могло дати відповідь, але воно стосується відмінностей між двома конкретними файлами, а не між двома конкретними комітами. Все інше, виявлене пошуками, теж було тупиком ....

Я думаю, у вас є проблеми, тому що Git - неправильний інструмент для роботи. Це не полегшує завдання, а поступатися інструментом - неправильний підхід. Інструменти повинні працювати для вас, а не навпаки .

Виконайте другий клон, а потім перевірте стартову версію, про яку йдеться. Потім запустіть регулярний диф на них з допомогою поточної версії: 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

2
Жоден з цих варіантів не допомагає в цьому випадку: diff все одно розглядає розрив рядка як відмінний від відсутності розриву рядка.
Жиль 'ТАК - перестань бути злим'

1
з останньою git (v2.20.1):error: invalid option: -Z
Morteza Ziyae

4
@MortezaZiaeemehr варіант призначений для diffкоманди, а не для gitкоманди. Ця відповідь рекомендує використовувати інструмент diff і не використовувати git для поточної роботи.
saraf

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