开源项目Trac有一个出色的差异荧光笔 - 它突出显示更改的行和每个更改行中的更改字节!有关示例,请参见此处或此处。
有没有办法在 bash 终端或diff 输出(补丁文件)中使用相同的颜色突出显示(即更改的行和更改的字节)?git
vim
diff-highlight
Perl 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'
git config --global interactive.diffFilter diff-highlight
在使用git diff
或git log
可能还有其他时,使用选项--word-diff=color
(顺便说一句,单词差异还有其他模式)
diff-so-fancy
是diff
专为人类眼球设计的荧光笔。
它删除了对剪切/粘贴来说很烦人的前导+
/ -
,并在文件之间明确了部分。
彩色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
which 将获取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 (如果需要),而不仅仅是使用 default less
。
您想要的行为现在可以在 git 本身中使用(正如 naught101 在评论中指出的那样)。要启用它,您需要将寻呼机设置为
perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
Ubuntu 13.10 上荧光笔脚本的位置在哪里/usr/share/doc/git/contrib/diff-highlight/diff-highlight
(我不知道为什么它在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 版本上,我在自述文件中的说明不起作用。
自 v1.7.8 1以来,官方 Git 已分发了基于字节的差异的实用程序。您只需找到它在您机器上的安装位置并启用它。
/usr/local/opt/git
(更高版本/opt/homebrew/Cellar/git/VERSION
:)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
我使用--color-words
选项,它对我来说很好:
$ git diff --color-words | less -RS
正如@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你也可以在没有任何安装的情况
下尝试 next :git
git diff --color-words=.
更复杂:
git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
比较
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
添加到更改的字节中。
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
注意:这是在此处找到的内容的副本:如何改进 git 的差异突出显示?. 不过,也在这里发布我的答案,因为它可能对直接找到此线程的某些人有所帮助:)
正如在之前的一些答案中所说,这只有 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
是的,Vim 这样做包括突出显示一行内更改的文本。有关如何区分文件的更多详细信息,
请参阅:h diff
和。:h 08.7
Vim 使用一种相当简单的算法来突出显示。它在该行中搜索第一个更改的字符,然后是最后一个更改的字符,并简单地突出显示它们之间的所有字符。
这意味着每行不能有多个亮点 - Vim 中的许多设计决策优先考虑效率。
vimdiff file1 file2
将显示两个文件之间的字符差异。
vimdiff 是一个包含在 vim 中的 diff 工具。(Vim 应该用 +diff 选项编译,以确保你可以检查:version
)
您也可以从 vim 内部启动它。有关:help diff
更多信息和命令,请参阅。