开源项目Trac有一个优秀的差异突出显示器 - 它突出显示更改的行并更改了每个更改行中的字节数!有关示例,请参阅here或here
是否可以在bash终端中使用相同的颜色突出显示(即更改的行和更改的字节),git
或vim
用于diff输出(补丁文件)吗
答案 0 :(得分:48)
diff-highlight
Perl contrib script生成的输出与Trac截图的输出非常相似,Trac可能正在使用它:
安装时:
wget https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight && chmod +x diff-highlight
将文件diff-highlight
移至~/bin/
目录(或$PATH
所在的位置),然后将以下内容添加到~/.gitconfig
:
[pager]
diff = diff-highlight | less
log = diff-highlight | less
show = diff-highlight | less
@cirosantilli建议的单拷贝粘贴安装:
cd ~/bin
curl -O https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight
chmod +x diff-highlight
git config --global pager.log 'diff-highlight | less'
git config --global pager.show 'diff-highlight | less'
git config --global pager.diff 'diff-highlight | less'
答案 1 :(得分:33)
在使用git diff
或git log
以及可能的其他人时,请使用选项--word-diff=color
(还有其他模式用于单词差异BTW)
答案 2 :(得分:12)
diff-so-fancy
是diff
- 专为人眼设计的荧光笔。
它删除了对剪切/粘贴感到烦恼的前导+
/ -
,并在文件之间做了清晰的部分。
有色git
(左)vs diff-so-fancy
(右 - 请注意字符级高亮):
如果您想要diff-so-fancy
(右侧)输出但不限于git
存储库中的文件,请将以下函数添加到.bashrc
以在任何文件上使用它:< / p>
dsf() { git diff --no-index --color "$@" | diff-so-fancy; }
例如:
dsf original changed-file
字符级别突出显示和标准diff
格式
如果您不喜欢diff-so-fancy
的非标准格式,但仍想要字符级git
突出显示,请使用diff-highlight
,git
输出并生成非常标准的diff
- 格式输出:
默认情况下,git
使用它,添加到.gitconfig
:
[color "diff-highlight"]
oldNormal = red bold
oldHighlight = red bold 52
newNormal = green bold
newHighlight = green bold 22
[pager]
diff = diff-highlight | less -FRXsu --tabs=4
[pager]
部分告诉git
将已经着色的输出管道传输到diff-highlight
,它在字符级别进行着色,然后以较少的(如果需要)将输出分页,而不仅仅是使用默认的less
。
答案 3 :(得分:10)
我使用--color-words
选项,它对我来说很好用:
$ git diff --color-words | less -RS
答案 4 :(得分:9)
您想要的行为现在可以在git中使用(正如naught101在评论中指出的那样)。要启用它,您需要将寻呼机设置为
perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
其中/usr/share/doc/git/contrib/diff-highlight/diff-highlight
是Ubuntu 13.10上的突出显示脚本的位置(我不知道为什么它在doc
文件夹中)。如果您的系统上没有,请尝试使用locate diff-highlight
进行查找。请注意,突出显示脚本不可执行(至少在我的机器上),因此需要perl
。
要始终将荧光笔用于各种类似diff的命令,只需将以下内容添加到~/.gitconfig
文件中:
[pager]
log = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
show = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
diff = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
我添加了这个作为一个新的答案naught101的评论被埋没了,因为设置并不是应该如此微不足道,至少在Ubuntu的版本上,我有README don'中的说明工作。
答案 5 :(得分:6)
自v1.7.8 1 开始,官方Git便已发布了基于字节的差异的实用程序。您只需要找到计算机上的安装位置并启用它即可。
/usr/local/opt/git
cd / && pwd -W
来找到安装目录。ll $(which git)
或locate git
应该会有所帮助。diff-highlight
链接到您的bin目录,以便您的PATH可以找到它GIT_HOME='/usr/local/opt/git/' # Use the value from the first step.
ln -s "${GIT_HOME}/share/git-core/contrib/diff-highlight/diff-highlight" \
'/usr/local/bin/diff-highlight'
git config --global interactive.diffFilter diff-highlight # Use on interactive prompts
git config --global pager.diff "diff-highlight | less" # Use on git diff
git config --global pager.log "diff-highlight | less" # Use on git log
git config --global pager.show "diff-highlight | less" # Use on git show
1 这是v1.7.8 version,但此后已经制作了lots of changes。
答案 6 :(得分:4)
@dshepherd says:
您想要的行为现在可以在git本身中使用
但diff-highlight
位于DOC中,无法从shell获取
要将diff-highlight
安装到~/bin
目录中,请按照以下步骤进行操作(这样可以保存您的输入内容):
$ locate diff-highlight
$ cd /usr/share/doc/git/contrib/diff-highlight #or path you locate
$ sudo make
$ mv diff-highlight ~/bin
然后将.gitconfig
配置为官方文档说明:
[pager]
log = diff-highlight | less
show = diff-highlight | less
diff = diff-highlight | less
<强> UPD 强>
您也可以在最新的git
上尝试下一个,无需任何安装:
git diff --color-words=.
更复杂:
git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
答案 7 :(得分:1)
Emacs具有ediff-patch-buffer功能,可以满足您的需求。
在emacs类型ESC-x,ediff-patch-buffer中打开未修补的文件。
按照提示操作,您应该会看到文件的已修补版本和原始版本的突出显示比较。
根据您的评论,以下内容将为您提供仅需要dwdiff的bash解决方案:
#!/bin/bash
paste -d'\n' <(dwdiff -2 -L -c <(cat $2) <(patch $2 -i $1 -o -)) <(dwdiff -1 -L -c <(cat $2) <(patch $2 -i $1 -o -))| uniq
答案 8 :(得分:1)
<强> Diffy 强>
GitLab正在使用Diffy https://github.com/samg/diffy(Ruby)来实现类似于GitHub和diff-highlight的输出:
Diffy使用相同的算法ad Git使diff本身,并支持不同类型的输出,包括GitLab使用的HTML输出:
gem install diffy
echo '
require "diffy"
puts Diffy::Diff.new("a b c\n", "a B c\n").to_s(:html)
' | ruby
输出:
<div class="diff">
<ul>
<li class="del"><del>a <strong>b</strong> c</del></li>
<li class="ins"><ins>a <strong>B</strong> c</ins></li>
</ul>
</div>
请注意strong
如何添加到更改的字节中。
答案 9 :(得分:0)
是的,Vim会这样做,包括突出显示在一行内更改的文字
有关如何区分文件的详细信息,请参阅:h diff
和:h 08.7
。
Vim使用一种相当简单的算法进行突出显示。 它在行中搜索第一个更改的字符,然后搜索最后更改的字符,并简单地突出显示它们之间的所有字符 这意味着每行不能有多个亮点 - Vim中的许多设计决策都会优先考虑效率。
答案 10 :(得分:0)
vimdiff file1 file2
将在两个文件之间显示字符差异。
vimdiff是包含在vim中的diff工具。 (Vim应该使用+ diff选项编译,以确保您可以使用:version
进行检查)
您也可以从vim内部启动它。
有关更多信息和命令,请参阅:help diff
。
答案 11 :(得分:0)
注意:这与这里的How to improve git's diff highlighting?重复。不过,也将我的答案发布在这里,因为这可能对直接找到此线程的某些人有用:)
如先前的回答所述,只有git的东西才有可能。我将其发布,因为根据您的系统,说明可能会更容易遵循,但这与其他几个答案类似。
一种完全依赖git及其贡献的解决方案。除了 git 附带的文件之外,不需要其他文件。所有说明均针对Ubuntu(已在18.04LTS上测试),在其他Linux系统上应具有类似的作用:
find -L /usr -name diff-highlight -type f
在我的系统上,唯一有效的答案是:
/usr/share/doc/git/contrib/diff-highlight/diff-highlight
sudo chmod +x /usr/share/doc/git/contrib/diff-highlight/diff-highlight
~/.gitconfig
以获得所需的结果(请注意,这些是TABS,而不是4个空格):[color "diff-highlight"]
oldNormal = red
oldHighlight = red 52
newNormal = green
newHighlight = green 22