当我键入gitdiff时,我想用我选择的可视化diff工具(Windows上的SourceGear“diffmerge”)查看输出。如何配置git以执行此操作?
当前回答
这是一个适用于Windows的批处理文件-假设DiffMerge安装在默认位置,处理x64,根据需要处理前向反斜杠替换,并能够自行安装。应该很容易用你喜欢的diff程序替换DiffMerge。
要安装:
gitvdiff --install
gitvdiff.bat:
@echo off
REM ---- Install? ----
REM To install, run gitvdiff --install
if %1==--install goto install
REM ---- Find DiffMerge ----
if DEFINED ProgramFiles^(x86^) (
Set DIFF="%ProgramFiles(x86)%\SourceGear\DiffMerge\DiffMerge.exe"
) else (
Set DIFF="%ProgramFiles%\SourceGear\DiffMerge\DiffMerge.exe"
)
REM ---- Switch forward slashes to back slashes ----
set oldW=%2
set oldW=%oldW:/=\%
set newW=%5
set newW=%newW:/=\%
REM ---- Launch DiffMerge ----
%DIFF% /title1="Old Version" %oldW% /title2="New Version" %newW%
goto :EOF
REM ---- Install ----
:install
set selfL=%~dpnx0
set selfL=%selfL:\=/%
@echo on
git config --global diff.external %selfL%
@echo off
:EOF
其他回答
这在Windows 7上适用。不需要中间sh脚本
.gitconfig的内容:
[diff]
tool = kdiff3
[difftool]
prompt = false
[difftool "kdiff3"]
path = C:/Program Files (x86)/KDiff3/kdiff3.exe
cmd = "$LOCAL" "$REMOTE"
从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++定义为外部编辑器。
如果您不熟悉命令行,那么如果您安装了TortoiseGit,您可以右键单击一个文件以获得带有“Diff later”选项的TortoiseGit子菜单。
当您在第一个文件上选择此选项时,您可以右键单击第二个文件,转到TortoiseGit子菜单并选择“Diffwith==yourfilehere==”。这将为结果提供TortoiseGit合并GUI。
对于如何在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"
我在这里尝试了一些新奇的东西(使用tkdiff),但没有任何效果。所以我写了下面的脚本,tkgitdiff。它做了我需要它做的事。
$ cat tkgitdiff
#!/bin/sh
#
# tkdiff for git.
# Gives you the diff between HEAD and the current state of your file.
#
newfile=$1
git diff HEAD -- $newfile > /tmp/patch.dat
cp $newfile /tmp
savedPWD=$PWD
cd /tmp
patch -R $newfile < patch.dat
cd $savedPWD
tkdiff /tmp/$newfile $newfile
推荐文章
- 如何查看一个分支中的哪些提交不在另一个分支中?
- 如何取消在github上的拉请求?
- HEAD和master的区别
- GIT克隆在windows中跨本地文件系统回购
- RPC失败;卷度传输已关闭,剩余未完成的读取数据
- 我应该在.gitignore文件中添加Django迁移文件吗?
- 错误:您对以下文件的本地更改将被签出覆盖
- Git rebase—即使所有合并冲突都已解决,仍然会继续报错
- 在Git中,我如何知道我的当前版本是什么?
- 跟踪所有远程git分支作为本地分支
- 自定义SSH端口上的Git
- git如何显示不存在于.gitignore中的未跟踪文件
- Git错误:遇到7个文件应该是指针,但不是
- GitHub克隆与OAuth访问令牌
- 移动(或“撤销”)最后一个git提交到非暂存区域