仅使用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可以防止less用作寻呼机。
- 如果第一个参数是
@full,则该函数将显示除添加和删除的行以外的所有未更改的行。
请注意此方法与以下方面的区别git diff:
git diff报告围绕每个更改的三行上下文。不幸的是,diff如果您要指定上下文行数同时指定格式选项,似乎会抱怨并退出。(至少在Mac OS X Yosemite中如此)。谢谢diff程序员。因此,您可以不要求每次更改周围有上下文行,这是默认行为,或者可以通过指定@full为第一个参数来请求报告文件中所有未更改的行。
- 由于上下文行与的不同
git diff,因此该函数报告的行号也将与git diff。
- 您可能会看到报告了单行更改的存在,这是正确的行为,但是当更改的文件包含单行空行插入时,这很烦人。我认为
git diff可以通过上下文来更好地解决这一问题。diff如果愿意,您可以尝试传递不同的选项以更好地处理空白。
newtext在/etc/colordiff。我认为git使用绿色?