开源项目Trac具有出色的diff荧光笔-突出显示更改后的行和每行更改后的字节!请参阅此处或此处的示例。
是否可以在bash终端中使用相同的颜色突出显示(即,更改的行和更改的字节)git
,也vim
可以使用diff输出(补丁文件)?
Answers:
在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 add -p
。还请加上:git config --global interactive.diffFilter diff-highlight
在使用git diff
或git log
(可能还有其他)时,请使用选项--word-diff=color
(单词差异BTW还有其他模式)
--word-diff=color
确实更好(尤其是使用git config color.diff.old "red reverse"
和git config color.diff.new "green reverse"
),但这不是我想要的:(
git add --patch
:stackoverflow.com/questions/10873882/...
diff-highlight
是,它对于单词差异和行差异均适用。
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
它将获取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
字符级别的颜色,然后以较少的页面输出(如果需要),而不仅仅是使用default less
。
gitconfig
选项?
dsf()
。
您想要的行为现在可以在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添加到列表中会导致其挂起。
git config interactive.diffFilter diff-highlight
diff-highlight
它不在我的路上,所以我必须先找到它。详情请见下文。
自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
which git
要求它在首位的路径,所以如果它不是:-)它不会工作
diff-highlight
,但实际上并没有安装它,因此symlink步骤确实是必需的(至少在macOS上)。如果发现您的平台不是必需的,请再次随意更新答案。同时,which git
通常可以正常工作,因为Git 确实将git
二进制文件安装在路径上的某个位置。
.perl
。编译非常简单:只需sudo make
在diff-highlight
目录中运行即可。
我使用--color-words
option,对我来说效果很好:
$ 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
另外,您也可以在git
不进行任何安装的情况下尝试进行最新操作:
git diff --color-words=.
更复杂:
git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
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
colordiff -u <(patch original_file -i patch_file -o -) <(cat original_file)
但这只是要突出显示已更改的行而不是被咬住……
dwdiff -c --diff-input diff_file
迪菲
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
添加到更改的字节中。
是的,Vim这样做包括突出显示一行中更改的文本。
请参阅:h diff
和:h 08.7
了解有关如何比较文件的更多详细信息。
Vim使用一种相当简单的算法进行突出显示。它在行中搜索第一个更改的字符,然后搜索最后一个更改的字符,并仅突出显示它们之间的所有字符。
这意味着您每行不能有多个突出显示-Vim中的许多设计决策都会优先考虑效率。
vimdiff file1 file2
将按字符显示两个文件之间的差异。
vimdiff是vim中包含的差异工具。(Vim应该已经使用+ diff选项进行编译,以确保您可以使用进行检查:version
)
您也可以从vim内部启动它。请参阅:help diff
以获取更多信息和命令。
vimdiff file.old file.new -c 'FormatCommand diffformat' -c 'w! file.diff.html' -c 'qa!'
。
screen -D -m
或追加&>/dev/null
(/ dev / null变体有时会产生奇怪的错误)),并在格式化完成后退出vim,但这是纯vimscript和即使使用我的优化,对于大文件来说也非常慢。
注意:这是在这里找到的重复项:如何改善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