我喜欢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-ugit 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 文件中,最常见的是它是.bashrcor .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>选项会做你想要的。你试过了吗 ?