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

开放源代码项目 Trac有一个出色的差异高亮显示器 & mdash; 它突出改变行 并且在每个改变的行中改变字节!参见 给你给你的例子。

Is there way to use the same color highlight (i.e. changed lines 还改了字节) in bash terminal, git, or vim 输出(补丁文件) ?

25672 次浏览

是的,Vim 会做到这一点,包括在一行内更改文本的高亮显示。
有关如何区分文件的更多细节,请参见 :h diff:h 08.7

Vim uses a fairly simple algorithm for it's highlighting. 它在该行中搜索第一个更改的字符,然后搜索最后一个更改的字符,并简单地突出显示它们之间的所有字符。
这意味着每行不能有多个亮点—— Vim 中的许多设计决策都是为了提高效率。

当使用 git diff或者 git log或者其他选项时,使用选项 --word-diff=color(还有其他模式用于单词差异 BTW)

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

我使用 --color-words选项,它对我很有效:

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

diff-highlight Perl 贡献脚本产生的输出与 Trac 的截图非常相似,因此 Trac 很可能正在使用它:

screenshot of diff-highlight in use

安装:

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

Single copy paste install suggested by @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'
git config --global interactive.diffFilter diff-highlight

难以置信

GitLab 正在使用迪菲 https://github.com/samg/diffy(Ruby)来实现类似于 GitHub 的输出和 diff 高亮:

enter image description here

Diffy makes the diff itself using the same algorithm ad Git, and supports different types of outputs, including the HTML output that GitLab uses:

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添加到更改后的字节中。

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

作为一个新的回答,我添加了这个,00101的评论被埋没了,因为设置并不像它应该的那样微不足道,至少在 Ubuntu 版本中,我在 自述中的指令不起作用。

diff-so-fancy 是一种专为人眼球设计的 diff荧光笔。

它删除了前导的 +/-,这对于剪切/粘贴来说是很烦人的,并且在文件之间制造了清晰的区段。

彩色 git(左) vs diff-so-fancy(右-注意字符级高光) :

diff-so-fancy output

If you want thediff-so-fancy (right side) output but not constrained to files in a git repository, add the following function to your .bashrc to use it on any files:

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

例如:

dsf original changed-file

字符级高亮和标准 diff格式

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

diff-highlight screenshot

要默认从 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-highlightdiff-highlight在字符级别上着色,然后以较少的数量(如果需要的话)分页输出,而不仅仅使用默认的 less

作为 @ 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=.

More complex:

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'

自从1.7.8 1版本以来,一个用于基于字节差异的实用程序已经随官方 Git 发布。您只需要找到它安装在您的计算机上的位置并启用它。

查找安装 Git 的位置

  • 通过 自酿的安装了 Git 的 MacOS 是 /usr/local/opt/git(以后的版本是 /opt/homebrew/Cellar/git/VERSION)
  • 带有 适用于 Windows 的 Git的 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

这里是 V1.7.8版本,但是 很多变化从那时起就被制造出来了。

注意 : 这是 如何改善 git 的差异突出?的副本。在这里也发布我的答案,因为它可能对一些直接找到这个帖子的人有帮助:)

正如在前面的一些答案中所说的,只有 git 的东西才有可能做到这一点。我张贴这个指示可能会更容易遵循取决于您的系统,但这是类似于其他几个答案。

一个完全依赖于 git 及其贡献的解决方案。这不需要比 饭桶更多的文件。所有的解释都是针对 Ubuntu (在18.04 LTS 上测试)的,应该可以在其他 Linux 系统上类似地工作:

  • 找到 diff-屈服贡献的 git 代码片段:
find -L /usr -name diff-highlight -type f

on my system the only valid answer is:

/usr/share/doc/git/contrib/diff-highlight/diff-highlight
  • 使相应的 perl 脚本可执行:
sudo chmod +x /usr/share/doc/git/contrib/diff-highlight/diff-highlight
  • 通过添加(注意这些是 TABS,而不是4个空格)来更新 ~/.gitconfig以得到您想要的结果:
[color "diff-highlight"]
oldNormal = red
oldHighlight = red 52
newNormal = green
newHighlight = green 22
  • 享受结果(注意: 这只是为了差异着色 + 突出显示,我在这里还有其他事情在发挥作用,当然为提示:))。

diff-highligh

回答一个相似但略有不同的问题中,我建议使用 三角洲部队,这是一个现代的差异后处理工具,专门支持同时突出显示单词和行的特殊需求。

Delta 是高度 可配置的(模拟模式用于 diff-highlightdiff-so-fancy) ,包括许多 特征在其他工具中找不到: 肩并肩视图,语法突显,以及 合并冲突git blame output的着色。

Delta 文档还有一个 相关项目概览,它提到了一些可以突出显示单词和行的特别工具。

Delta diff formatting example