如何得到差异工作像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 )。
-
安装colordiff 。
-
更新〜/ .colordiffrc(如果需要,首先复制/ etc / colordiffrc):
# be more git-like: plain=off newtext=darkgreen oldtext=darkred diffstuff=darkcyan
-
对于两个文件使用
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
只使用bash
, diff
, tput
和less
,我们可以非常接近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的工作原理如下:
- 最终,通过各种格式化选项调用
diff
来指定如何显示文件中的更改。 -
tput
用于在这些格式化选项中插入ANSI颜色代码。 请注意,使用非ANSIterminal时,可能需要用tput setf
replacetput setaf
。 -
diff
的输出被输送到less
。-R
允许保留ANSI颜色。-X
可以防止在退出时清除屏幕。 如果输出适合一个屏幕,则-F
防止作为寻呼机操作less
。 - 如果第一个参数是
@full
,那么除了添加和删除的行之外,该函数将显示所有未更改的行。
请注意这种方法和git diff
之间的git diff
:
-
git diff
报告围绕每个更改的三行上下文。 不幸的是,diff
似乎抱怨并退出,如果你想指定上下文线的数量,同时也指定格式化选项。 (至less它在Mac OS X优胜美地)。 谢谢diff
程序员。 因此,您可以请求不包含每个更改的上下文环境(这是默认行为),也可以通过将@full
指定为第一个参数来请求文件中所有未更改的行也被报告。 - 由于上下文的行不同于
git diff
,这个函数报告的行号也会不同于git diff
报告的行号。 - 您可能会看到报告的单行更改,这是正确的行为,但是当您更改的文件包含插入单个空行时会很烦人。 我认为
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 ) }