我喜欢git diff
的输出格式。线条之间的变化的颜色和+
/ -
表示比GNU差异更容易阅读。
我可以在git repo之外使用git diff
标志运行--no-index
,它运行正常。但是,它似乎缺少--exclude
选项,用于从递归diff
中排除文件或子目录。
有没有办法让两全其美? (GNU差异的+
和-
选项的颜色选项和git diff
/ --exclude
格式)。
我已尝试使用colordiff
,但我仍然更喜欢git diff
的输出格式
答案 0 :(得分:135)
我不知道如何做颜色,但这样做+/-
而不是<
和>
。
diff -u file1 file2
答案 1 :(得分:81)
您还可以使用git diff --no-index -- A B
(通过manpage)。
答案 2 :(得分:23)
安装colordiff。
更新你的〜/ .colordiffrc(如有必要,首先复制/ etc / colordiffrc):
# be more git-like:
plain=off
newtext=darkgreen
oldtext=darkred
diffstuff=darkcyan
将colordiff -u file1 file2
用于两个文件或colordiff -ruN path1 path2
用于递归比较路径。
它不完全相同,但它非常接近。
答案 3 :(得分:15)
这是我建议的,而且非常接近
diff -u FILE1 FILE2 | colordiff | less -R
colordiff
:您必须安装此功能
brew install colordiff
。port install colordiff
。sudo apt-get install colordiff
-R
:这告诉Less显示颜色而不是原始代码。我最终使用-w
,因为我不想看到空白差异。
diff -w -u FILE1 FILE2 | colordiff | less -R
编辑:正如@Ciprian Tomoiaga在评论中所建议的那样,你可以将它作为一个函数并将它放在你的~/.bashrc
文件中。
function gdiff () { diff -u $@ | colordiff | less -R; }
答案 4 :(得分:2)
您正在寻找colordiff
:
sudo apt-get install colordiff
答案 5 :(得分:2)
仅使用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
以更好地处理空格。答案 6 :(得分:2)
根据Unix SE上的this answer,GNU --color
自2016年末版本3.4起有-u
个选项。与git diff
一起应该足以模仿diff -u --color=always file1 file2 | less -r
:
--color
always
必须为auto
,less -R
会关闭管道中的颜色。
我只在Windows上使用Git Bash尝试过此操作,其中less -r
只会为大块的第一行着色。 df3=`is.na<-`(df2,is.na(df1))
df3
Col1 Col2 Col3 Col4
1 7 0 5 7
2 NA 8 NA 0
3 9 9 NA 2
在这种情况下为我修好了。
答案 7 :(得分:1)
将其放在.bashrc
或.zshrc
:
diff() { git diff --no-index "$1" "$2" | colordiff; }
要求:git
和colordiff
应该事先安装。
用法:diff file1 file2
示例:for $ diff .tmux.conf .zshrc.pre-oh-my-zsh
答案 8 :(得分:0)
另一个选择是从存储库外部执行它,因此git知道在文件之间进行区分。例如。 shell函数类似于:
gdiff() {
(
dir=`pwd`
cd ./$(git rev-parse --show-cdup)/..
git diff $dir/$1 $dir/$2
)
}
答案 9 :(得分:0)
使用colordiff:
安装:
sudo apt-get install colordiff
用法:
colordiff -u file_one file_two
给出与git diff
完全相同的差异。
答案 10 :(得分:0)
如果您没有colordiff
或git diff
,则可以通过vim
获得颜色。
cdiff() { diff -u $@ | vim -R -; }
或者简单地
cdiff() { diff -u $@ | view -; }
答案 11 :(得分:0)
由于bat的着色效果很好,我已经测试了它是否也可以与diff
一起使用,而且令人惊讶的是,它开箱即用地很好。
$ diff file1 file2 | bat
或$ diff -u file1 file2 | bat
所以我想您可以使下面的函数更高效:
function bdiff () { diff -u $@ | bat;}
答案 12 :(得分:0)
在debian 9中测试
diff -u --color=always file1 file2
答案 13 :(得分:-1)
我认为配置设置:
[color]
ui = true
结合“diff”命令的--relative=<path>
选项可以做你想要的。你试过吗?