のみ使用し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
します。 出力が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は緑を使用していると思いますか?