web-dev-qa-db-ja.com

コミット間のgit-diffによる*すべて*の空白の変更を無視する

私はコードベースを調べ、空白の修正を行い、一般にインデントなどを修正しています。他の変更を誤って行っていないことを確認したいので、すべての違いを表示するためにgit diff -wを実行しています空白の違いを無視してファイルを変更しました。問題は、これは実際にはall空白の違いを無視していないことです。少なくともwhatI単なる空白の違いであると考えてください。たとえば、git diff -wからの次の出力では、

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

あなたは私が

  1. 余分な空白行を削除し、
  2. 値が開くキーの行の終わりに中括弧を入れます。
  3. コンテキストに合わせてインデント

この質問 最初は答えを提供するように見えましたが、2つの特定のファイルの違いではなく、2つの特定のcommits。検索で見つかった他のすべても行き止まりでした。たとえば、 この質問 は違いを表示するのではなく、マージに関するものです。 この質問 はWordレベルの違いを表示するなどです。

60
iconoclast

おそらくより良い答えがありますが、これまでのところ私が見つけた最良の解決策はこれです。

まず、Gitが現在使用している「空白」の定義を制御する必要があります。プロジェクトに.gitconfigを作成または編集して、含める

[core]
    whitespace = -trailing-space,-indent-with-non-tab,-tab-in-indent

次に、使用するWordの定義を制御する必要があります。 git diff -wを使用する代わりに、--Word-diff-regex=[^[:space:]]を追加します。

git diff -w  --Word-diff-regex=[^[:space:]]

コンテキストがまだ表示されますが、これは(私の場合、違いがないことを確認しようとしているのでexcept whitespace difference)役に立ちません。 -U0を使用して、Gitに0行のコンテキストを提供するように指示できます。

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

ただし、コンテキストにほとんど似た出力が得られますが、すべての変更を注意深く手動で調べて、それらが空白の変更のみであることを確認するよりもはるかに優れています。

49
iconoclast

無視allコミット間のgit-diffによる空白の変更

この質問は最初は答えを提供するように見えましたが、2つの特定のコミット間の違いではなく、2つの特定のファイル間の違いを扱っています。検索で見つかった他のすべても行き止まりでした....

Gitは仕事にとって間違ったツールであるため、問題を抱えていると思います。タスクを簡単にすることはできません。また、ツールに対応するための譲歩は間違ったアプローチです。ツールはではなく(== --- ==)動作するはずです

2番目のクローンを実行し、問題の開始リビジョンをチェックアウトします。次に、現在のリビジョンdiff -bur --ignore-all-space <dir1> <dir2>を使用して、それらに対して定期的なdiffを実行します。

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
29
jww