1. ホーム
  2. git

[解決済み] コミット間の git-diff で空白の変更を *全て* 無視する

2023-04-11 18:20:05

質問

私はコードベースを調べていて、空白のおかしなところを修正したり、一般的にインデントなどを修正しているのですが、うっかり他の変更をしていないか確認したいので git diff -w を使って、空白の違いを無視して、変更されたすべてのファイルの違いを表示しています。 問題は、これは実際には無視できない すべて の空白の違いを無視しているわけではありません。 I は単なる空白の違いだと考えています。 例えば、次の git diff -w ,

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

だけであることがわかると思います。

  1. 余分な空白行を削除しています。
  2. 中括弧を、その値が開いているキーの行末に付け、そして
  3. 文脈に合うようにインデントされます。

この質問 は、最初は答えを提供しているように見えましたが、2 つの特定の ファイル の違いではなく、2 つの特定の コミット . 検索して出てきた他のすべてのものも同様に行き止まりでした。 例えば この質問 はマージについてであり、差分を表示するものではありませんし この質問 は単語レベルの差分を表示することを扱っている、といった具合です。

どのように解決するのですか?

もしかしたらもっと良い答えがあるかもしれませんが、私がこれまで見つけた最良の解決策はこれです。

まず、Gitが現在使用している"whitespace"の定義を制御する必要があります。

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:]]'

を実行しても、文脈とほぼ同じような出力が得られますが、それでも、すべての変更に注意深く目を通し、手作業で空白の変更だけであることを確認するよりはるかに優れています。

上記のすべてを 1 つのコマンドで行うこともできます。その場合 -c フラグは、1つのコマンドに対してのみ git の設定を変更します。

git -c core.whitespace=-trailing-space,-indent-with-non-tab,-tab-in-indent diff -U0 --word-diff-regex='[^[:space:]]'