如何得到差异工作像git差异?

我喜欢git-diff的输出格式。 颜色选项和行间变化的+/-表示比标准的GNU diff更容易阅读(恕我直言)。

我看到,我可以在git仓库之外的两个文件或目录上运行git diff,并且工作正常。 但是,它似乎缺less“–exclude”选项从recursiondiff中排除文件或子目录。 我想知道是否有办法让两全其美? (即,颜色选项和git-diff的+/-格式, – 排除GNU diff的选项)。

我已经尝试了colordiff ,但我仍然喜欢git-diff的输出格式。

我不知道如何做颜色,但是这会做+/-而不是<>

 diff -u file1 file2 

你也可以使用git diff --no-index -- AB (通过manpage )。

  1. 安装colordiff 。

  2. 更新〜/ .colordiffrc(如果需要,首先复制/ etc / colordiffrc):

     # be more git-like: plain=off newtext=darkgreen oldtext=darkred diffstuff=darkcyan 
  3. 对于两个文件使用colordiff -u file1 file2或recursion比较path的colordiff -ruN path1 path2

这不完全一样,但非常接近。

这是我的build议,它非常接近

 diff -u FILE1 FILE2 | colordiff | less -R 
  • colordiff :你必须安装这个
    • brew install colordiff在我的Mac上brew install colordiff
    • port install colordiff在某些Mac上port install colordiff
    • sudo apt-get install colordiff在Debian或Ubuntu上sudo apt-get install colordiff
    • 对于其他平台,请从主页面或GitHub下载源代码并按照安装说明进行操作
  • -R :这告诉less显示颜色,而不是原始代码。

我最终使用-w因为我不想看到空白差异。

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

编辑:正如@Ciprian Tomoiaga在评论中所build议的那样,你可以把这个函数放到~/.bashrc文件中。

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

您正在寻找colordiff

 sudo apt-get install colordiff 

只使用bashdifftputless ,我们可以非常接近git diff的输出。 不过,由于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 } 

该function的工作原理如下:

  1. 最终,通过各种格式化选项调用diff来指定如何显示文件中的更改。
  2. tput用于在这些格式化选项中插入ANSI颜色代码。 请注意,使用非ANSIterminal时,可能需要用tput setfreplacetput setaf
  3. diff的输出被输送到less-R允许保留ANSI颜色。 -X可以防止在退出时清除屏幕。 如果输出适合一个屏幕,则-F防止作为寻呼机操作less
  4. 如果第一个参数是@full ,那么除了添加和删除的行之外,该函数将显示所有未更改的行。

请注意这种方法和git diff之间的git diff

  1. git diff报告围绕每个更改的三行上下文。 不幸的是, diff似乎抱怨并退出,如果你想指定上下文线的数量,同时也指定格式化选项。 (至less它在Mac OS X优胜美地)。 谢谢diff程序员。 因此,您可以请求不包含每个更改的上下文环境(这是默认行为),也可以通过将@full指定为第一个参数来请求文件中所有未更改的行也被报告。
  2. 由于上下文的行不同于git diff ,这个函数报告的行号也会不同于git diff报告的行号。
  3. 您可能会看到报告的单行更改,这是正确的行为,但是当您更改的文件包含插入单个空行时会很烦人。 我认为git diff通过它的上下文来处理这个问题。 如果你愿意的话,你可以尝试传递不同的选项来更好地处理空白。

我认为configuration设置:

 [color] ui = true 

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

另一个select是从仓库外面做,所以git知道文件之间的差异。 例如。 一个shell函数就像这样:

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