完全なコンテキストでgit diffを取得する方法?


114

るつぼでのレビューに適したパッチを作成するにはどうすればよいですか?

git diff branch master --no-prefix > patch

これにより、3行のコンテキストのみが生成されます。だから私は次のことをします

git diff --unified=2000 branch master --no-prefix > patch

うまくいけば、すべてのファイルの行数は2000行未満になります。最大行数を指定せずにgitにpatchのすべての行を含めるように指示する方法はありますか?


3
私は別の質問として、ファイル全体を表示する-U <無限大>オプションを掲載stackoverflow.com/questions/28727424/...
アレクサンドルLevchuk

回答:


54

私はこれが古いことを知っていますが、ハードコーディングされたソリューションも嫌いなので、これをテストしました:

git diff -U$(wc -l MYFILE)

-Uを使用することがこの問題に対処する唯一の方法のようですが、行数を使用すると、非常に大きなファイルの小さな変更でも機能することが保証されます。


1
<必要ありません。git diff -U$(wc -l MYFILE) MYFILE
balki

2
@balkiに感謝します。あなたの提案を試してみましたが、<pre> $(wc -l MYFILE)</ pre>は行数の後にファイル名が続くため、ファイル名の2番目の使用も省略することができます。私はこれを反映するために私の答えを更新しています。
Ezra

4
これは差分です。ファイルには2つのバージョンがあります。ディスクにないバージョンが2倍の長かった場合はどうなりますか?非常に大きな数の-Uは実際に安全ではありませんか?
Eloff、2018

@Eloff、それは本当です。本当に大きな数でも反対の問題があるため、長さを最大にすることが最善の方法です。このソリューションでは、ディスク上の現在のファイルサイズより大きい連続した削除が行われていないと想定しています。
エズラ、

3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILEwcサブシェルの引用符で囲まれていない出力に依存せずに2つの引数を作成せずに、空白なしで行数​​を取得するだけでの出力を正しく解析し、macOS / BSDで動作するより良い答えです。
anishpatel

94

これはかなりうまくいくようです:

git diff --no-prefix -U1000

注意点:

-Uフラグは、コンテキストの行を指定します。変更の間隔が1000行を超える場合は、これを増やす必要がある場合があります。


16
-Uあなたがお勧めのオプションは同じです--unified=アスカーが使用するオプション。唯一の違いは、指定するコンテキスト行数を1000とすることです。これは、使用するアスカー2000と比べて1000です。@ balkiは、数を無限大に増やす方法を知りたがっていますが、数を半分に減らすことをお勧めします。どうして?
LS

4
@LS:うん、私は今気づいたが、数年前にそれを見落とした。それでも、何が起こっているのかは質問の場合よりもはっきりしており、ここに着く奇妙な人を助けるようです。
c24w

このおかげで、それもgit show
Shakeel、2016年

@ c24w同意しましたが、画面に表示したいものを取得できます。
シェフのファラオ

1
この--no-prefixオプションは、デフォルトで表示される「/ a /」および「/ b /」宛先プレフィックスを削除します。(リンク先ページ)
ラッキードナルド2017

10

注:git1.8.1rc1の発表(2012年12月8日)には以下が含まれます。

新しい構成変数 " diff.context"を使用して、パッチ出力のコンテキスト行のデフォルト数を指定し、ハードコードされたデフォルトの3行を上書きできます。

これにより、ここで、より完全なコンテキストを生成できます。


7
それでも、「ファイル内のすべての行」と言うオプションはありません
balki

3
「すべての線」をシミュレートする大きな数字を入れると私は思う
VonC

7
「数字を多く入れると、「すべての線」をシミュレートするのではないかと思います。すべては無限大と同義であり、非常に大きな数はそれだけです-無限ではなく数です。
2015

4

インスピレーションを得たので、gitエイリアスを追加しました。

$ cat ~/.gitconfig | fgrep diff
        df = "!git diff -U$(wc -l \"$1\" | cut -d ' ' -f 1) \"$1\""
$ git df <file>

更新:

「git df」を実行するとディレクトリが変更されるため、「git df」が機能しない場合があります。(gitエイリアスが間違ったディレクトリで動作するを参照してください)。これは更新されたバージョンです:

$ cat ~/.gitconfig | fgrep df
        df = "! [ \"$GIT_PREFIX\" != \"\" ] && cd \"$GIT_PREFIX\"; ~/bin/git_df.sh"
$ 
$ cat ~/bin/git_df.sh
#!/bin/bash
for FILE in $@; do
    git diff -U$(wc -l "${FILE}" | cut -d ' ' -f 1) "${FILE}"
done
exit 0


0

以前に受け入れられた解決策は、特定のファイル/コミットを表示するときに機能しません(-Uオプションはrev /パスの解析に干渉するようです)が--inter-hunk-context=、この場合はgit version 2.24.0次のように機能します。

git diff \
    --no-prefix \
    --inter-hunk-context=2000 \
    master -- \
        path/to/file.py

ファイルサイズがわからない場合はwc -l、ハードコーディングする代わりに、もちろん次のようにして見つけることができます。

git diff \
    --no-prefix \
    --inter-hunk-context=$(wc -l path/to/file.py) \
    master -- \
        path/to/file.py
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.