在区分文件时,我更喜欢使用git diff --color-words
。有没有办法在使用git add --patch
或git add --interactive
时将其设为差异的默认格式?
答案 0 :(得分:17)
建立VonC所说的话:
从Git 2.9开始,您可以使用此命令在add --patch
:
git -c interactive.diffFilter="git diff --color-words" add -p
这会为interactive.diffFilter
的呼叫设置add -p
变量,而不会影响其他呼叫。对我而言,这是理想的,因为我通常希望正常运行add -p
,但有时希望使用--color-words
运行它。
您可以轻松地为此命令添加别名,如下所示:
git config --global alias.addcw '-c interactive.diffFilter="git diff --color-words" add -p'
答案 1 :(得分:16)
我最近解决了这个问题,但它需要在git中修改Perl脚本。但这很简单,不需要特殊技能。
此解决方案要求您的git配置使用颜色化进行屏幕输出,因为这是git显示基于单词的差异的唯一情况。
git-add--interactive
从您的安装中复制到PATH
环境变量中的某个位置,并将其重命名为git-add--interactive-words
。@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --), $path);
到
@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --color-words --), $path);
git add-interactive--words
以使用基于字词的彩色差异来完成git add --interactive
的等效操作。git add --patch
与之合并是很尴尬的,因为您需要为新脚本传递正确的参数。幸运的是,您可以为.gitconfig
:[alias]
iaddpw = add--interactive-words --patch=stage --
表示git iaddpw
使用彩色基于单词的差异运行等效于git add --interactive --patch
。
答案 2 :(得分:10)
从VonC's answer获取提示。以下是使用git 2.9中引入的--interactive
选项的详细步骤。
将diff-highlight添加到您的路径中。
cd ~/bin
curl -LO "https://raw.githubusercontent.com/git/git/master/contrib/diff-highlight/diff-highlight"
chmod u+x diff-highlight
如果必须,请重新启动shell。
然后配置Git,以便在他们在寻呼机中显示差异时过滤差异:
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
这会特别强调一行的变化部分,与--word-diff
几乎相同。
优点是你可以在git log --patch
或git add -p
处获得单词差异。
答案 3 :(得分:9)
使用git 2.9(2016年6月),您将有一个新选项:interactive.diffFilter
。
commit 0114384见Jeff King (peff
)(2016年2月27日)
(由Junio C Hamano -- gitster
--合并于commit 2052c52,2016年4月3日)
add --interactive
:允许自定义差异突出显示程序add - interactive的补丁程序块选择器知道如何询问 git for colorized diffs,并将它们与 我们申请的无色差异。但是没有办法 有人使用像contrib这样的diff-filter工具 差异突出显示正常突出显示。
此补丁允许用户定义任意shell命令 管道彩色差异通过。确切的输出不应该 问题(因为我们只是向人类展示结果)只要 它与原始差异线性兼容(所以 hunk-splitting也可以拆分彩色版本。
然后,您可以将该差异传输到diff --color-words
。
commented作为Andrew Dufresne,GitHub blog post引用了贡献脚本contrib/diff-highlight
:
您可以使用“
--color-words
”仅突出显示已更改的部分 线。但是,对于代码而言,这通常很难阅读,因为它失败了 线结构,你最终得到奇怪的格式化位。相反,此脚本对面向行的diff进行后处理,查找对 线条,并突出显示不同的部分。
结果更加强调了一行的变化部分:
关于这些差异,“diff-highlight
”过滤器(在contrib/
中)学习了更好的“git log --graph
”输出。
请参阅commit 4551fbb,commit 009a81e,commit fbcf99e,commit 7ce2f4c,commit e28ae50,commit 53ab9f0,commit 5013acc(2018年3月21日) Jeff King (peff
)
(Junio C Hamano -- gitster
--合并于commit d19e556,2018年4月10日)
请参阅“diff-highlight
: detect --graph
by indent”
注意:在Git 2.17(2018年第二季度)之前,“interactive.diffFilter
”使用的“git add -i
”必须在其输入和输出之间保持一对一的对应关系,但它没有强制执行,导致最终用户混淆。
我们现在至少确保过滤后的结果与输入的行数相同,以检测破碎的过滤器。
commit 42f7d45见commit af3570e,Jeff King (peff
)(2018年3月3日)
(由Junio C Hamano -- gitster
--合并于commit c5e2df0,2018年3月14日)
答案 4 :(得分:3)
如前所述,将diff-highlight
添加到interactive.diffFilter
配置密钥是最简单的选择(自Git 2.9起)。以下命令在没有复制脚本,更改权限或修改$ PATH的情况下在Debian / Ubuntu上执行了这个技巧:
git config interactive.diffFilter "perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight"
git -c interactive.diffFilter="git diff --color-words" add -p
或git config interactive.diffFilter "git diff --color-words"
之类的内容无法正常运行:add -p
始终会建议修改第一个文件。
答案 5 :(得分:2)
这个工具做得很好https://github.com/mookid/diffr
[core]
pager = diffr | less -R
[interactive]
diffFilter = diffr
答案 6 :(得分:1)
将diff-highlight | less -FRX --tabs=4
用作您的diffFilter
:
git -c interactive.diffFilter="diff-highlight | less -FRX --tabs=4" add --patch
有关diff-highlight
:source,a quick primer
如果您使用的是Homebrew(OS X),则可以在.gitconfig
中放入以下内容(以使用已安装的diff-highlight
):
[interactive]
diffFilter = "$(git --exec-path | sed 's/libexec/share/')/contrib/diff-highlight/diff-highlight | less -FRX --tabs=4"
从git 2.17开始,单词diff解必须在输入和输出行之间保持1-1对应,以避免:
$ git -c interactive.diffFilter="git diff --word-diff --color" add --patch
fatal: mismatched output from interactive.diffFilter
hint: Your filter must maintain a one-to-one correspondence
hint: between its input and output lines.
diff-so-fancy
尚不支持此功能:https://github.com/so-fancy/diff-so-fancy/issues/35
答案 7 :(得分:-6)
在$(HOME)/ .gitconfig文件中添加此
[color]
diff = auto
interactive = auto
应该这样做。