git diff
の出力フォーマットが好きです。行間の変化の色と+
/-
表現は、GNU diffよりも読みやすいです。
git diff
フラグをgitリポジトリの外で使用して--no-index
を実行でき、正常に動作します。ただし、ファイルまたはサブディレクトリを再帰diff
から除外するための--exclude
オプションが欠落しているようです。
両方の長所を活用する方法はありますか? (色オプションと+
の-
/git diff
形式とGNU diff)の--exclude
オプション。
colordiff
を試してみましたが、git diff
の出力形式の方が好きです
色の付け方がわかりませんが、これで+/-
のではなく <
および>
。
diff -u file1 file2
git diff --no-index -- A B
を使用することもできます( manpage を使用)。
colordiff をインストールします。
〜/ .colordiffrcを更新します(必要に応じて、最初に/ etc/colordiffrcをコピーします):
# be more git-like:
plain=off
newtext=darkgreen
oldtext=darkred
diffstuff=darkcyan
つかいます colordiff -u file1 file2
2つのファイルまたはcolordiff -ruN path1 path2
パスを再帰的に比較します。
まったく同じではありませんが、非常に近いものです。
これは私が提案するものであり、かなり近いです
diff -u FILE1 FILE2 | colordiff | less -R
colordiff
:これをインストールする必要があります-R
:これは、未加工コードの代わりに色を表示するようLessに指示します。最終的には-w
ホワイトスペースの差分を表示したくなかったため。
diff -w -u FILE1 FILE2 | colordiff | less -R
編集:@Ciprian Tomoiagaのコメントで示唆されているように、これを関数にして~/.bashrc
ファイルも。
function gdiff () { diff -u $@ | colordiff | less -R; }
bash
、diff
、tput
、およびless
のみを使用すると、git diff
の出力を厳密に近似できます。ただし、diff
プログラマーの近視眼のために、いくつかの顕著な違いがあります。
次のBash関数定義を、ユーザーアカウントから自動的に取得されるファイルに配置すると、コマンドラインから関数にアクセスできるようになります。
function gdiff()
{
local REG=`tput op`
local GRP=`tput setaf 6`
local ADD=`tput setaf 2`
local REM=`tput setaf 1`
local NL=$'\n'
local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"
local UNCH_GRP_FMT=''
[[ "${1}" == '@full' ]] && {
UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
shift
}
diff \
--new-line-format="${ADD}+%L${REG}" \
--old-line-format="${REM}-%L${REG}" \
--unchanged-line-format=" %L${REG}" \
--new-group-format="${GRP_LABEL}${NL}%>" \
--old-group-format="${GRP_LABEL}${NL}%<" \
--changed-group-format="${GRP_LABEL}${NL}%<%>" \
--unchanged-group-format="${UNCH_GRP_FMT}" \
"${@}" | less -FXR
}
この関数は次のように機能します。
diff
は、ファイル内の変更がどのように表示されるかを指定するためのさまざまなフォーマットオプションで呼び出されます。tput
は、ANSIカラーコードをこれらのフォーマットオプションに挿入するために使用されます。非ANSI端末を使用する場合は、tput setaf
をtput setf
に置き換える必要があることに注意してください。diff
の出力は、less
にパイプされます。 -R
を使用すると、ANSIカラーを保持できます。 -X
は、less
が終了時に画面をクリアしないようにします。 -F
は、出力が1画面に収まる場合、less
がポケットベルとして動作するのを防ぎます。@full
の場合、関数は追加および削除された行に加えて、変更されていないすべての行を表示します。このアプローチとgit diff
の以下の違いに注意してください。
git diff
は、各変更を囲む3行のコンテキストを報告します。あいにく、diff
は、コンテキスト行の数を指定すると同時に書式設定オプションも指定したい場合、文句を言って終了するようです。 (少なくともMac OS X Yosemiteではそうです)。 diff
プログラマーに感謝します。したがって、デフォルトの動作である各変更を囲むコンテキスト行を要求しないか、@full
を最初のパラメーターとして指定することにより、ファイル内のすべての変更されていない行も報告されるように要求できます。git diff
とは異なるため、この関数によって報告される行番号もgit diff
によって報告される行番号と異なります。git diff
は、コンテキスト行を介してこれをより適切に処理していると思います。必要に応じて、diff
にさまざまなオプションを渡して、空白の処理を改善することができます。GNU diff
には、Unix SEの この回答 に従って、2016年後半のバージョン3.4以降の--color
オプションがあります。 -u
と並んでgit diff
の出力を模倣するには十分です:
diff -u --color=always file1 file2 | less -r
--color
はパイプで使用する場合はalways
でなければなりません。auto
はパイプの色をオフにします。
私はこれをWindowsのGit Bashでのみ試しましたが、less -R
はハンクの最初の行にのみ色を付けます。 less -r
はその場合私のためにそれを修正しました。
あなたが探している colordiff
:
Sudo apt-get install colordiff
colordiff を使用します。
インストール:
Sudo apt-get install colordiff
使用法:
colordiff -u file_one file_two
git diff
で示されるものとまったく同じ違いを与えます。
もう1つのオプションは、リポジトリの外部から実行することで、gitはファイル間の差分を認識します。例えば。次のようなシェル関数:
gdiff() {
(
dir=`pwd`
cd ./$(git rev-parse --show-cdup)/..
git diff $dir/$1 $dir/$2
)
}