当我键入gitdiff时,我想用我选择的可视化diff工具(Windows上的SourceGear“diffmerge”)查看输出。如何配置git以执行此操作?
当前回答
我还有一个补充。我喜欢经常使用不支持作为默认工具之一的diff应用程序(例如万花筒),通过
git difftool -t
我还希望将默认diff作为常规命令行,因此设置GIT_EXTERNAL_diff变量不是一个选项。
您可以使用以下命令一次性使用任意diff应用程序:
git difftool --extcmd=/usr/bin/ksdiff
它只将2个文件传递给您指定的命令,因此您可能也不需要包装器。
其他回答
从Git1.6.3开始,您可以使用gitdifftool脚本:参见下面的答案。
也许这篇文章会对你有所帮助。以下是最好的部分:
有两种不同的方法来指定外部差异工具。
第一种是您使用的方法,通过设置GIT_EXTERNAL_DIFF变量。但是,该变量应该指向可执行文件的完整路径。此外,GIT_EXTERNAL_DIFF指定的可执行文件将使用固定的7个参数集调用:
path old-file old-hex old-mode new-file new-hex new-mode
由于大多数diff工具将需要不同的参数顺序(并且只有一些),因此您很可能需要指定一个包装脚本,而包装脚本反过来调用真正的diff工具。
第二种方法(我更喜欢)是通过“git”配置外部diff工具config“。下面是我所做的:
1) 创建一个包装脚本“gitdiffwrapper.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>
在命令提示符下,替换为“gitdiffwrapper.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工具具有显式返回状态,您可能希望尝试不使用尾随cat)
(Diomidis Spinellis在评论中补充道:
cat命令是必需的,因为如果文件不同,diff(1)默认退出时会显示错误代码。Git期望外部diff程序仅在发生实际错误时(例如,内存用完时)退出并返回错误代码。通过将git的输出管道到cat,非零错误代码被屏蔽。更有效的方法是,程序只需在参数为0的情况下运行exit。)
这(上面引用的文章)是通过配置文件(而不是通过环境变量)定义的外部工具的理论。在实践中(对于外部工具的配置文件定义),您可以参考:
如何使用msysgit/gitk设置DiffMerge?它说明了MsysGit和gitk的DiffMerge和WinMerge的具体设置我如何设置一个编辑器来在Windows上使用Git?将Notepad++定义为外部编辑器。
如果你在Mac上,并且有Xcode,那么你已经安装了FileMerge。终端命令是opendiff,因此您可以执行以下操作:
git difftool -t opendiff
在查看了其他一些外部差异工具后,我发现IntelliJ IDEA(和Android Studio)中的差异视图是我最喜欢的。
步骤1-设置IntelliJ IDEA以从命令行运行
如果要使用IntelliJ IDEA作为差异工具,应首先设置IntelliJ IDEA,以便按照以下说明从命令行运行:
在macOS或UNIX上:
确保IntelliJ IDEA正在运行。在主菜单上,选择“工具”|“创建命令行启动器”。将打开“创建启动器脚本”对话框,其中包含启动器脚本的建议路径和名称。您可以接受默认值,也可以指定自己的路径。注意它,因为你稍后会需要它。在IntelliJ IDEA之外,将启动器脚本的路径和名称添加到路径中。
在Windows上:
在Path系统环境变量中指定IntelliJ IDEA可执行文件的位置。在这种情况下,您将能够从任何目录调用IntelliJ IDEA可执行文件和其他IntelliJ IDEA命令。
步骤2-配置git以使用IntelliJ IDEA作为difftool
遵循此博客文章的说明:
Bash
export INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
PATH=$IDEA_HOME $PATH
Fish
set INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
set PATH $INTELLIJ_HOME $PATH
现在将以下内容添加到git配置中:
[merge]
tool = intellij
[mergetool "intellij"]
cmd = idea merge $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED")
trustExitCode = true
[diff]
tool = intellij
[difftool "intellij"]
cmd = idea diff $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE")
您可以使用gitdifftool或gitdifftoolHEAD~1进行测试
尝试此解决方案:
$ meld my_project_using_git
Meld了解Git,并提供最近更改的导航。
对于如何在1.6.3之前的Git版本上配置diff工具的Linux版本(1.6.3向Git添加了difftool),这是一个非常简洁的教程。
简而言之:
步骤1:将其添加到.gitconfig中
[diff]
external = git_diff_wrapper
[pager]
diff =
步骤2:创建一个名为git_diff_wrapper的文件,将其放在$PATH中的某个位置
#!/bin/sh
vimdiff "$2" "$5"
推荐文章
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别
- GitHub -致命:无法读取用户名https://github.com':没有这样的文件或目录
- 撤消git平分错误
- 使用.gitconfig配置diff工具
- 如何从另一个文件A中删除文件B中出现的行?
- 如何配置Mac OS X术语,使git有颜色?