Игнорировать любое пустое пространство или разрыв строки в git -diff
У меня есть один и тот же файл, представленный двумя разными способами, и хочу сравнить его с помощью git diff
, заботясь о игнорировании каждого пробела, вкладки, перерыва строки, возврата каретки или все, что не является строго исходным кодом моих файлов.
Я действительно пытаюсь это сделать:
git diff --no-index --color --ignore-all-space <file1> <file2>
но когда некоторые html-теги свертываются все на одной строке (вместо одной строки и табулированной) git -diff detect - это разница (в то время как для меня это не так).
<html><head><title>TITLE</title><meta ......
отличается от
<html>
<head>
<title>TITLE</title>
<meta ......
Какой вариант я пропустил, чтобы выполнить то, что мне нужно, и угроза, как будто это было то же самое?
Ответы
Ответ 1
git diff
поддерживает сравнение файлов по строкам или по слову, а также поддерживает определение того, что делает слово. Здесь вы можете определить каждый непространственный символ как слово для сравнения. Таким образом, он будет игнорировать все пробелы, включая white-spcae, tab, line-break и carrige-return, как вам нужно.
Чтобы достичь этого, существует идеальный вариант --word-diff-regex
, и просто установите его --word-diff-regex=[^[:space:]]
. Подробнее см. doc.
git diff --no-index --word-diff-regex=[^[:space:]] <file1> <file2>
Вот пример. Я создал два файла с a.html
следующим образом:
<html><head><title>TITLE</title><meta>
С b.html
следующим образом:
<html>
<head>
<title>TI==TLE</title>
<meta>
Запустив
git diff --no-index --word-diff-regex=[^[:space:]] a.html b.html
Он выделяет разницу TITLE
и TI{+==+}TLE
в двух файлах в режиме plain
следующим образом. Вы также можете указать --word-diff=<mode>
для отображения результатов в разных режимах. mode
может быть color
, plain
, porcelain
и none
, а по умолчанию plain
.
diff --git a/d.html b/a.html
index df38a78..306ed3e 100644
--- a/d.html
+++ b/a.html
@@ -1 +1,4 @@
<html>
<head>
<title>TI{+==+}TLE</title>
<meta>
Ответ 2
git -diff сравнивает файлы по строкам
Он проверяет первую строку вашего файла1 на том, что в файле2, так как они не совпадают с сообщением об ошибке.
Игнорирование пробела означает, что foo bar будет соответствовать foobar, если на той же строке. Поскольку ваши файлы охватывают несколько строк в одной и только одной строке в другом, файлы всегда будут отличаться
Если вы действительно хотите проверить, что файлы содержат одинаковые символы без пробелов, вы можете попробовать что-то вроде этого:
diff <(perl -ne 's/\s*//xg; print' file1) <(perl -ne 's/\s*//g; print' file2)
Надеюсь, что он решает вашу проблему!
Ответ 3
Это делает трюк для меня:
git diff --ignore-blank-lines