web-dev-qa-db-ja.com

git-diffの空白や改行を無視します

同じファイルを2つの異なる方法でレンダリングし、git diffを使用して比較したいのですが、すべての空白、タブ、改行、キャリッジリターンを無視などを処理します。それは厳密には私のファイルのソースコードではありません。

私は実際にこれを試しています:

git diff --no-index --color --ignore-all-space <file1> <file2>

しかし、いくつかのhtmlタグが(1行に1つではなく、表にまとめられて)すべて1行に折りたたまれている場合git-diff検出は違いとして(私にとってはそうではない)。

<html><head><title>TITLE</title><meta ......

とは異なります

<html>
    <head>
        <title>TITLE</title>
        <meta ......

必要なことや脅威を同じであるかのように達成するために、どのオプションを見逃しますか?

22
Kamafeather

git diffは、ファイルを1行ずつまたはWordごとに比較することをサポートし、Wordを構成するものの定義もサポートします。ここでは、すべての非スペース文字をWordとして定義して比較を行うことができます。このようにして、必要に応じて、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を使用して2つのファイルを作成しました。

<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モードの2つのファイルのplainTI{+==+}TLEの違いを強調しています。 --Word-diff=<mode>を指定して、さまざまなモードで結果を表示することもできます。 modecolorplainporcelainnoneで、デフォルトは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>
23
Landys

これは私のためのトリックを行います:

git diff --ignore-blank-lines
2
Big McLargeHuge

git-diffはファイルを1行ずつ比較します

File1の最初の行をfile2の最初の行とチェックします。これらは同じではないため、エラーを報告します。

空白を無視すると、同じ行にある場合、fooバーはfoobarと一致します。ファイルは1行で複数行にまたがっており、他の行は1行しかないため、ファイルは常に異なります。

ファイルにまったく同じ空白以外の文字が含まれていることを本当に確認したい場合は、次のようにしてみてください。

diff <(Perl -ne 's/\s*//xg; print' file1) <(Perl -ne 's/\s*//g; print' file2)

それがあなたの問題を解決することを願っています!

0
Mudassir Razvi