如何使用我的首选diff工具/查看器查看“git diff”输出?
当我输入git diff
,我想用我选择的视觉差异工具(Windows上的SourceGear“diffmerge”)查看输出结果。 我如何配置git来做到这一点?
从Git1.6.3开始,你可以使用git difftool脚本 :参见下面的答案。
可能是这篇文章会帮助你。 这里是最好的部分:
有两种不同的方式来指定外部差异工具。
首先是您使用的方法,通过设置GIT_EXTERNAL_DIFF变量。 但是,该变量应该指向可执行文件的完整路径。 而且,由GIT_EXTERNAL_DIFF指定的可执行文件将使用一组固定的7个参数进行调用:
path old-file old-hex old-mode new-file new-hex new-mode
由于大多数差异工具将需要不同的顺序(并且只有一些)参数,所以您很可能必须指定一个包装脚本,而这又会调用真正的差异工具。
我更喜欢的第二种方法是通过“git config”配置外部diff工具 。 这是我所做的:
1)创建一个包含类似的东西的包装脚本“git-diff-wrapper.sh”
-->8-(snip)--
#!/bin/sh
# diff is called by git with 7 parameters:
# path old-file old-hex old-mode new-file new-hex new-mode
"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--
正如你所看到的,只有第二个(“旧文件”)和第五个(“新文件”)参数将被传递给diff工具。
2)类型
$ git config --global diff.external <path_to_wrapper_script>
在命令提示符处,替换为“git-diff-wrapper.sh”的路径,以便您的〜/ .gitconfig包含
-->8-(snip)--
[diff]
external = <path_to_wrapper_script>
--8<-(snap)--
确保使用正确的语法来指定包装器脚本和diff工具的路径,即使用正向斜杠而不是反斜杠。 就我而言,我有
[diff]
external = "c:/Documents and Settings/sschuber/git-diff-wrapper.sh"
在.gitconfig和
"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat
在包装脚本中。 注意尾随的“猫”!
(我认为只有某些程序不需要返回适当的或一致的返回状态时才需要' | cat
',如果你的diff工具有明确的返回状态,你可能想尝试没有尾随的猫)
(上面引用的文章)是通过配置文件 (而不是通过环境变量) 定义的外部工具的理论。
在实际中(仍然用于外部工具的配置文件定义),您可以参考:
要完成上面的“diff.external”配置答案:
正如Jakub所说,Git1.6.3引入了2008年9月提出的git difftool :
USAGE = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(请参阅此答案最后部分的--extcmd
)
$LOCAL
包含起始修订中的文件内容, $REMOTE
包含结束修订中文件的内容。
$BASE
包含wor中文件的内容
它基本上是git-mergetool
修改以在git索引/工作树上运行。
这个脚本的通常用例是当你有变化或未变化的变化时,你想看到并排差异查看器中的变化(例如xxdiff
, tkdiff
等)。
git difftool [<filename>*]
另一个用例是当你想看到相同的信息,但比较任意提交(这是revarg解析可能更好的部分)
git difftool --start=HEAD^ --end=HEAD [-- <filename>*]
最后一个用例是当你想将你当前的工作树与HEAD以外的东西进行比较时(例如一个标签)
git difftool --commit=v1.0.0 [-- <filename>*]
注意:既然Git 2.5, git config diff.tool winmerge
就够了!
请参阅“git mergetool winmerge”
并且从Git --dir-diff
,您可以选择--dir-diff
,以便生成外部差异工具,该工具可以在填充两个临时目录后一次比较两个目录层次结构,而不是一次运行外部工具的实例每个文件对。
在Git 2.5之前:
使用自定义diff工具配置difftool
实际案例:
C:myGitRepo>git config --global diff.tool winmerge
C:myGitRepo>git config --global difftool.winmerge.cmd "winmerge.sh "$LOCAL" "$REMOTE""
C:myGitRepo>git config --global difftool.prompt false
将winmerge.sh保存在PATH的目录中:
#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"
如果您有其他工具(kdiff3,P4Diff,...),请创建另一个shell脚本以及适当的difftool.myDiffTool.cmd
配置指令。
然后,您可以使用diff.tool
配置轻松切换工具。
您也有Dave的这个博客文章添加其他细节。
(或者winmergeu
选项的这个问题)
对此设置的兴趣是winmerge.sh
脚本 :您可以对其进行自定义以考虑特殊情况。
下面以David Marble的答案为例说明一个例子:
Kem Mason在他的回答中提到,你也可以通过使用--extcmd
选项来避免任何包装 :
--extcmd=<command>
指定用于查看差异的自定义命令。 git-difftool
忽略配置的默认值,并在指定此选项时运行$command $LOCAL $REMOTE
。
例如,这是gitk
如何运行/使用任何diff
工具。
本着回答与问题有所不同的问题的精神。 尝试此解决方案:
$ meld my_project_using_git
Meld了解git并提供有关最近更改的导航。
链接地址: http://www.djcxy.com/p/41953.html上一篇: How do I view 'git diff' output with my preferred diff tool/ viewer?