web-dev-qa-db-ja.com

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

るつぼでのレビューに適したパッチを作成する方法は?

git diff branch master --no-prefix > patch

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

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

すべてのファイルの行数が2000行未満になることを願っています。最大行を指定せずにパッチにファイルのすべての行を含めるようにgitに指示する方法はありますか?

100
balki

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

git diff -U$(wc -l MYFILE)

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

45
Ezra

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

git diff --no-prefix -U1000

警告付き:

-Uフラグは、コンテキストの行を指定します。変更の間に1000行以上ある場合、これを増やす必要があるかもしれません。

82
c24w

注: git1.8.1rc1アナウンス(2012年12月8日) に含まれるもの:

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

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

9
VonC

これはMac OSで私のために働いた:

git diff -U$(wc -l main.htm | xargs)

"Bash変数から空白を削除する方法?" を参照してください。

2
Nakilon

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

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

更新:

「git df」は、gitエイリアスを実行するときにディレクトリが変更されるため、動作しないことがあります。 ( 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
2
Yun Wu