如何让 diff 像 git-diff 一样工作?

我喜欢 git diff的输出格式。行之间更改的颜色和 +/-表示比 GNU diff 更容易阅读。

我可以运行 git diff使用 --no-index标志之外的一个 git 回购和它的工作很好。但是,它似乎缺少从递归 diff中排除文件或子目录的 --exclude选项。

有没有办法两全其美?(颜色选项和 +/-格式的 git diff--exclude选项的 GNU 差异)。

我已经试验过 colordiff,但是我仍然喜欢 git diff的输出格式

59890 次浏览

这将做 +/-而不是 <>

diff -u file1 file2

由于 GNU 将3.4扩充为 --color标志,这两个标志的组合使得以下内容成为可能:

diff --color -u file1 file2

标志 --color也有一个参数,有效的选项是 neveralwaysauto。有用的时候,你想更明确什么需要做。

我认为配置设置:

[color]
ui = true

结合“ diff”命令的 --relative=<path>选项可以做你想做的事情。你试过了吗?

另一种选择是从存储库外部执行,这样 git 就知道如何区分文件。例如 shell 函数:

gdiff() {
(
dir=`pwd`
cd ./$(git rev-parse --show-cdup)/..
git diff  $dir/$1 $dir/$2
)
}

你要找的是 colordiff:

sudo apt-get install colordiff

你也可以使用 git diff --no-index -- A B(通过 手册)。

  1. 安装 Collodiff

  2. 更新您的 ~/. color: (如果需要,首先复制/etc/color:):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. Use colordiff -u file1 file2 for two files or colordiff -ruN path1 path2 for recursively comparing paths.

It's not exactly the same, but it's very close.

这就是我的建议,很接近了

diff -u FILE1 FILE2 | colordiff | less -R
  • 你必须安装这个
    • 我 Mac 上的 brew install colordiff
    • 一些 Mac 上的 port install colordiff
    • Debian 或 Ubuntu 上的 sudo apt-get install colordiff
    • 对于其他平台,从 主页GitHub下载源代码,然后跟随 安装说明
  • -R: 这告诉 Less 显示颜色而不是原始代码。

我最终使用了 -w,因为我不想看到空格的差异。

diff -w -u FILE1 FILE2 | colordiff | less -R

编辑: 正如@CiprianTomoiaga 在评论中建议的那样,你可以把这个变成一个函数,也可以把它放到你的 ~/.bashrc文件中。

function gdiff () { diff -u $@ | colordiff | less -R; }

仅使用 bashdifftputless,我们就可以近似地得到 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
}

这项职能的作用如下:

  1. 最后,使用各种格式选项调用 diff,以指定文件内的更改将如何显示。
  2. tput用于将 ANSI 颜色代码插入到这些格式选项中。注意,在使用非 ANSI 终端时,可能必须用 tput setf替换 tput setaf
  3. diff的输出通过管道传输到 less-R允许保留 ANSI 的颜色。-X阻止 less在退出时清除屏幕。如果输出在一个屏幕内,则 -F阻止 less作为寻呼机运行。
  4. 如果第一个参数是 @full,则函数将显示所有未更改的行以及添加和删除的行。

请注意这种方法与 git diff之间的以下差异:

  1. git diff报告围绕每个更改的三行上下文。不幸的是,如果您希望指定上下文行的数量同时指定格式选项,那么 diff似乎会抱怨并退出。(至少在 Mac OS X Yosemite 中是这样的)。感谢 diff节目组。因此,您可以不请求围绕每个更改的上下文行(这是默认行为) ,也可以通过指定 @full作为第一个参数来请求报告文件中所有未更改的行。
  2. 由于上下文行不同于 git diff,因此此函数报告的行号也将不同于 git diff报告的行号。
  3. 您可能会看到报告的单行更改,这是正确的行为,但是当您更改的文件包含插入单个空行时,这种行为令人恼火。我认为 git diff更好地处理这个问题,通过它的上下文。如果您愿意,可以尝试将不同的选项传递给 diff,以更好地处理空白。

将其放入 rc 文件中,最常见的是 .bashrc.zshrc:

diff() { git diff --no-index "$1" "$2" | colordiff; }

要求: gitcolordiff应该已经安装。

用途: diff file1 file2

根据 Unix SE 上的 这个答案,GNU diff在2016年底的版本3.4之后就有了 --color选项。与 -u一起应该足以模拟 git diff的输出:

diff -u --color=always file1 file2 | less -r

在管道中使用时,--color必须是 alwaysauto会关闭管道中的颜色。

我只在 Windows 上的 Git Bash 中尝试过这种方法,在这种情况下,less -R只会为一个大块头的第一行着色。less -r帮我修好了那个箱子。

使用 Collodiff:

安装:

sudo apt-get install colordiff

用法:

colordiff -u file_one file_two

给出与 git diff所示完全相同的差异。

如果你没有 colordiff或者 git diff,你可以通过 vim得到颜色。

cdiff() { diff -u $@ | vim -R -; }

或者干脆

cdiff() { diff -u $@ | view -; }

由于 蝙蝠有很好的着色,我已经测试了它是否与 diff一起工作,令人惊讶的是,它真的很好的开箱即用。

$ diff file1 file2 | bat$ diff -u file1 file2 | bat

所以我认为你可以用下面这样的函数来提高效率:

function bdiff () { diff -u $@ | bat;}

在 Debian 9中测试 diff -u --color=always file1 file2

Alias diff = “ git diff —— no-index ——”

到 ~/. zhrc 或 ~/. bashrc

这使用 git diff 来完成两个文件之间的普通差异