我喜欢git diff
. 行间变化的颜色和+
/-
表示比 GNU diff 更容易阅读。
我可以在git repo 之外git diff
使用flag 运行,它工作正常。--no-index
但是,它似乎缺少--exclude
从递归中排除文件或子目录的选项diff
。
有没有办法两全其美?(GNU diff 的颜色选项和+
/-
格式git diff
和--exclude
选项)。
我已经尝试过colordiff
,但我仍然更喜欢的输出格式git diff
这将做+/-
而不是<
和>
。
diff -u file1 file2
自 GNU diffutils 3.4 以来,该标志--color
已被添加。将两者结合起来会产生以下效果:
diff --color -u file1 file2
该标志--color
还接受一个参数,有效选项是never
、always
或auto
。当您想更明确地说明需要做什么时很有用。
您也可以使用git diff --no-index -- A B
(通过manpage)。
安装colordiff。
更新您的 ~/.colordiffrc(如有必要,首先复制 /etc/colordiffrc):
# be more git-like:
plain=off
newtext=darkgreen
oldtext=darkred
diffstuff=darkcyan
用于colordiff -u file1 file2
两个文件或colordiff -ruN path1 path2
递归比较路径。
它不完全相同,但非常接近。
这就是我的建议,而且非常接近
diff -u FILE1 FILE2 | colordiff | less -R
colordiff
: 你必须安装这个
-R
:这告诉 Less 显示颜色而不是原始代码。我最终使用-w
了,因为我不想看到空格差异。
diff -w -u FILE1 FILE2 | colordiff | less -R
编辑:正如@Ciprian Tomoiaga 在评论中所建议的,您可以将其设为一个函数并将其也放入您的~/.bashrc
文件中。
function gdiff () { diff -u $@ | colordiff | less -R; }
根据Unix SE 上的这个答案, GNU从 2016 年末的 3.4 版diff
开始有一个选项。旁边应该足以模仿以下输出:--color
-u
git diff
diff -u --color=always file1 file2 | less -r
--color
必须always
在管道中使用时,auto
将关闭管道中的颜色。
我只在 Windows 上使用 Git Bash 尝试过这个,less -R
它只会给大块的第一行着色。less -r
在那种情况下为我修好了。
仅使用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
更好地处理空格。把它放在你的 rc 文件中,最常见的是它是.bashrc
or .zshrc
:
diff() { git diff --no-index "$1" "$2" | colordiff; }
要求:git
并且colordiff
应该已经安装。
用法 :diff file1 file2
您正在寻找colordiff
:
sudo apt-get install colordiff
由于bat具有很好的着色效果,我已经测试过它是否也适用,diff
并且令人惊讶的是它开箱即用的效果非常好。
$ diff file1 file2 | bat
或者$ diff -u file1 file2 | bat
所以我想你可以使下面这样的函数更有效:
function bdiff () { diff -u $@ | bat;}
在 debian 9 中测试
diff -u --color=always file1 file2
另一种选择是从存储库外部执行此操作,以便 git 知道文件之间的差异。例如。一个shell函数类似于:
gdiff() {
(
dir=`pwd`
cd ./$(git rev-parse --show-cdup)/..
git diff $dir/$1 $dir/$2
)
}
如果没有colordiff
或git diff
,可以通过 获取颜色vim
。
cdiff() { diff -u $@ | vim -R -; }
或者干脆
cdiff() { diff -u $@ | view -; }
使用colordiff:
安装:
sudo apt-get install colordiff
用法:
colordiff -u file_one file_two
给出与 所示完全相同的差异git diff
。
添加
别名 diff="git diff --no-index --"
到 ~/.zshrc 或 ~/.bashrc
这使用 git diff 来做两个文件之间的普通差异
我认为配置设置:
[color]
ui = true
结合“diff”命令的--relative=<path>
选项会做你想要的。你试过了吗 ?