のみ使用し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ます。 -RANSIカラーを保持できます。 終了時に画面がクリアされ-Xないようにlessします。 出力が1画面に収まる場合、ページャーとしての動作を-F防ぎlessます。
- 最初のパラメータがの
@full場合、関数は、追加および削除された行に加えて、変更されていないすべての行を表示します。
このアプローチとの次の違いに注意してくださいgit diff。
git diff各変更を囲む3行のコンテキストを報告します。残念ながら、diffコンテキスト行の数を指定すると同時にフォーマットオプションを指定したい場合、文句を言って終了するようです。(少なくともMac OS X Yosemiteではそうです)。diffプログラマに感謝します。したがって、@full最初のパラメーターとして指定することにより、デフォルトの動作である、各変更を囲むコンテキストの行を要求しないか、ファイル内のすべての変更されていない行も報告するように要求できます。
- コンテキストの行はとは異なるため、
git diffこの関数によって報告される行番号もによって報告されるものとは異なりますgit diff。
- 正しい動作である単一行の変更の存在が報告される場合がありますが、変更されたファイルに単一の空行の挿入が含まれている場合は不快です。私は
git diffその文脈の線を介して、これをよりよく扱うと思います。diff必要に応じて、空白をより適切に処理するためにさまざまなオプションを渡すことができます。
newtextは、で変更し/etc/colordiffます。gitは緑を使用していると思いますか?