突出显示更改的行和每个更改的行中的更改的字节


91

开源项目Trac具有出色的diff荧光笔-突出显示更改后的行和每行更改后的字节!请参阅此处此处的示例。

是否可以在bash终端中使用相同的颜色突出显示(即,更改的行和更改的字节git,也vim 可以使用diff输出(补丁文件)?


您想突出显示什么?您是否想要一个比较工具来改变字节变化?(那将非常有帮助)。您说的是vim,这让我想起了,在使用编程语言模板(和其他语言)时,vim已经进行了大量颜色操作。您将如何改变?在定义为VT100的终端窗口上,有许多技术可用于更改颜色(还有许多其他定义也将支持颜色转义序列)。请提供更多细节。或阅读en.wikipedia.org/wiki/VT100和相关链接。也许可以帮上忙。
Shellter

我知道您只对开源工具感兴趣,而对终端仅感兴趣。但是,作为参考,您可能需要查看slickedit的diffzilla。我使用的少数差异工具中,它似乎总是能最好
地表现出


注意:GitHub现在在其Web GUI中提供了这样的差异工具:stackoverflow.com/a/25723584/6309
VonC 2014年

我已经发布了“还有另一个”纯git,基于diff-highlight的解决方案,并带有教程,以轻松地1)找到相关的diff-highlight文件,2)使其可执行3)在.gitconfig中设置必要的参数。请看一看。说明适用于Ubuntu 18.04,但应在Linux系统上广泛使用。
Zorglub29

Answers:


57

diff-highlightPerl中的contrib脚本产生输出,类似于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'

这个。太好了 谢谢。不过,在某些地方似乎有些保守,但缺少一些明显具有大部分共同点的行。您是否有错误追踪器?
naught101 2013年

20
啊,这是现在核心git的一部分:github.com/git/git/tree/master/contrib/diff-highlight
naught101

2
现在已经变成一个模块,我认为最容易下载的版本是在raw.githubusercontent.com/git/git/…进行
Chris Midgley

4
这不仅是核心git的一部分,还与git一起分发,并且可能已经存在于您的系统中。我在下面的答案中添加了有关如何启用它的详细信息。↓
Cory Klein

1
这会错过您通过看到的差异git add -p。还请加上:git config --global interactive.diffFilter diff-highlight
josch

40

在使用git diffgit log(可能还有其他)时,请使用选项--word-diff=color(单词差异BTW还有其他模式)


2
--word-diff=color确实更好(尤其是使用git config color.diff.old "red reverse"git config color.diff.new "green reverse"),但这不是我想要的:(
Nikolay Frantsev 2011年

4
因此,您唯一缺少的就是用彩色标记/以某种方式同时更改了行和字节?
2011年

6
我想突出显示更改的行和每个更改的行中的更改的字节,就像在Trac中一样。不只是改变了字节,还不一样。
Nikolay Frantsev 2011年

您也可以使用这个有git add --patchstackoverflow.com/questions/10873882/...
naught101

的优点diff-highlight是,它对于单词差异和行差异均适用。
西罗Santilli郝海东冠状病六四事件法轮功

20

diff-so-fancydiff专为人类眼球设计的荧光笔。

它消除了领先的+/ -这是恼人剪切/粘贴,使文件之间明显的部分。

彩色git(左)与diff-so-fancy(右-注意字符级突出显示):

差异输出

如果要diff-so-fancy(右侧)输出但不限于git存储库中的文件,请向其中添加以下函数以.bashrc在任何文件上使用它:

dsf() { git diff --no-index --color "$@" | diff-so-fancy; }

例如:

dsf original changed-file

字符级别突出显示和标准diff格式

如果您不喜欢的非标准格式diff-so-fancy,但仍然想要字符级git突出显示,请使用diff-highlight它将获取git的输出并产生非常漂亮的标准diff格式输出:

diff-highlight屏幕截图

要从默认使用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字符级别的颜色,然后以较少的页面输出(如果需要),而不仅仅是使用default less


这很有趣,您能否解释一下这些gitconfig选项?
caesarsol

更新,还增加了功能dsf()
汤姆·黑尔

14

您想要的行为现在可以在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版本上不起作用。


我刚刚注意到,这并没有启用git add -p(交互模式)内差异的突出显示。我不知道该如何解决,只是将add添加到列表中会导致其挂起。
dshepherd

5
现在应该可以在git 2.9.0中运行:git config interactive.diffFilter diff-highlight
Thomas

^这!不幸的是,diff-highlight它不在我的路上,所以我必须先找到它。详情请见下文。
科里·克莱因

11

自v1.7.8 1起,官方Git便已发布了基于字节的差异的实用程序。您只需要找到计算机上的安装位置并启用它即可。

查找安装Git的位置

  • 通过Homebrew安装了Git的MacOS :/usr/local/opt/git
  • Windows with Git for Windows:运行cd / && pwd -W以找到安装目录。
  • Linux:书呆子。如果您还不知道Git的安装位置,那么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配置中启用它

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版本,但此后进行了许多更改


1
最好指定它开始使用git发行的版本。另外我猜测默认情况下发行版会将其放入PATH中,因此不需要symlink步骤吗?并which git要求它在首位的路径,所以如果它不是:-)它不会工作
西罗桑蒂利郝海东冠状病六四事件法轮功

2
这将是很好的!随时添加该信息。尽管Git确实捆绑了diff-highlight,但实际上并没有安装它,因此symlink步骤确实是必需的(至少在macOS上)。如果发现您的平台不是必需的,请再次随意更新答案。同时,which git通常可以正常工作,因为Git 确实git二进制文件安装在路径上的某个位置。
科里·克莱因

请注意,在debian不稳定版中,我需要“编译”此文件,因为我只有一个.perl。编译非常简单:只需sudo makediff-highlight目录中运行即可。
tobiasBora

10

我使用--color-wordsoption,对我来说效果很好:

$ git diff --color-words | less -RS

5
不,这显示了语言上的差异。OP(和我)想要的是正常的逐行差异,并突出显示单词差异(因此,说不同的行是彩色文本,而这些行中的单词差异是正常的彩色文本,带有彩色突出显示或东西)。请参阅问题中的示例链接。
naught101 2013年

1
pastebin.com/1JrhYHRt实际上,我将vimdiff用作difftool,将vimdiff与molokai colorscheme结合使用,可以很好地突出显示您所描述的问题。1- git config --global diff.tool vimdiff 2- in vim“:colo molokai” * Molokai @ github.com/tomasr/molokai *可能使用〜/ .vimrc进行自动colorcheme:如果&diff设置background = dark colorscheme molokai endif
13年

4

@dshepherd 所说

您想要的行为现在可以在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)+'

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

抱歉,我不想使用emacs,仅使用bash,git或vim
Nikolay Frantsev 2011年

这是可以理解的。我能想到的唯一的另一件事是在patch的stdout中使用colordiff: colordiff -u <(patch original_file -i patch_file -o -) <(cat original_file) 但这只是要突出显示已更改的行而不是被咬住……
Finbar Crago

我更加思考了您的问题,并附加了仅需dwdiff的第二个解决方案。
Finbar Crago

1
请仔细阅读我的问题,我不想比较文件
Nikolay Frantsev 2011年

1
很抱歉给您带来混乱,所以您只是想在diff文件的更改行上突出显示更改的字节吗?如果是这样的话dwdiff -c --diff-input diff_file
Finbar Crago

1

迪菲

GitLab使用Diffy https://github.com/samg/diffy(Ruby)来实现类似于GitHub和diff-highlight的输出:

在此处输入图片说明

Diffy使用相同的算法广告Git制作差异本身,并支持不同类型的输出,包括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添加到更改的字节中。


0

是的,Vim这样做包括突出显示一行中更改的文本。
请参阅:h diff:h 08.7了解有关如何比较文件的更多详细信息。

Vim使用一种相当简单的算法进行突出显示。它在行中搜索第一个更改的字符,然后搜索最后一个更改的字符,并仅突出显示它们之间的所有字符。
这意味着您每行不能有多个突出显示-Vim中的许多设计决策都会优先考虑效率。


不幸的是,它不会在diff输出上突出显示已更改的字节(设置文件类型= diff)
Nikolay Frantsev 2011年

1
我想我现在已经理解了您的问题-您想语法突出显示diff命令的文本输出,以便突出显示行内所做的任何更改。在Vim中编辑此文本将突出显示行差异,但不会突出显示行中所做的更改。
PDug 2011年

您可以使用Vim的:patchfile命令加载原始文件,然后将其与修补版本进行比较吗?
PDug 2011年

不幸的是,我要对多个文件使用递归差异输出
Nikolay Frantsev 2011年

0

vimdiff file1 file2 将按字符显示两个文件之间的差异。

vimdiff是vim中包含的差异工具。(Vim应该已经使用+ diff选项进行编译,以确保您可以使用进行检查:version

您也可以从vim内部启动它。请参阅:help diff以获取更多信息和命令。


我不想比较文件,我想突出显示diff(补丁)文件。
Nikolay Frantsev 2011年

@Nikolay Frantsev如果您不关心性能,可以安装我的format.vim插件并执行vimdiff file.old file.new -c 'FormatCommand diffformat' -c 'w! file.diff.html' -c 'qa!'
ZyX

它将以批处理方式进行比较(如果不想看到终端闪烁,则以批处理screen -D -m或追加&>/dev/null(/ dev / null变体有时会产生奇怪的错误)),并在格式化完成后退出vim,但这是纯vimscript和即使使用我的优化,对于大文件来说也非常慢。
ZyX 2011年

0

注意:这是在这里找到的重复项:如何改善git的差异突出显示?。不过也将我的答案发布在这里,因为这可能对直接找到此线程的某些人有用:)

如先前的回答所述,只有git的东西才有可能。我将其发布,因为根据您的系统,说明可能会更容易遵循,但这与其他几个答案类似。

一种完全依赖git及其贡献的解决方案。除了git附带的文件外,不需要其他文件。所有说明均针对Ubuntu(已在18.04LTS上测试),应在其他Linux系统上类似地工作:

  • 找到diff-highlight contrib git片段:
find -L /usr -name diff-highlight -type f

在我的系统上,唯一有效的答案是:

/usr/share/doc/git/contrib/diff-highlight/diff-highlight
  • 使相应的perl脚本可执行。就我而言,我需要做:
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
  • 享受结果(请注意:这仅用于diff着色+高亮显示,当然,对于提示我也有其他要求:))。

差异高光

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.