当我键入gitdiff时,我想用我选择的可视化diff工具(Windows上的SourceGear“diffmerge”)查看输出。如何配置git以执行此操作?
当前回答
尝试此解决方案:
$ meld my_project_using_git
Meld了解Git,并提供最近更改的导航。
其他回答
从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++定义为外部编辑器。
介绍
作为参考,我想加入我对VonC答案的变化。请记住,我使用的是MSys版本的Git(此时为1.6.0.2)和修改的PATH,并从PowerShell(或cmd.exe)运行Git本身,而不是Bash shell。
我引入了一个新命令gitdiff。运行此命令会暂时重定向git diff以使用您选择的可视化diff程序(与VonC的解决方案相反,VonC会永久执行此操作)。这使我既可以使用默认的Git diff功能(gitdiff),也可以使用可视化diff功能。这两个命令都采用相同的参数,例如,为了直观地区分特定文件中的更改,可以键入
gitdiff path/file.txt
安装程序
注意,$GitInstall用作安装Git的目录的占位符。
创建新文件$GitInstall\cmd\gitdiff.cmd@回声消失设置本地的对于/F“delims=”%%I in(“%~dp0...”)do@set path=%%~fI\bin;%%~fI\mingw\bin;%路径%如果“%HOME%”==“”@设置HOME=%USERPROFILE%设置GIT_EXTERNAL_DIFF=GIT-DIFF-visual.cmd设置GIT_PAGER=猫git差异%*末端局部的创建一个新文件$GitInstall\bin\git-diff-visual.cmd(用您选择的diff程序的完整路径替换[visual_diff_exe]占位符)@回声消失git使用7个参数调用rem-diff:rem路径旧文件旧十六进制旧模式新文件新十六进制新模式回声差异“%5”“[visual_diff_exe]”“%2”“%5”退出0你现在完成了。在Git存储库中运行gitdiff现在应该为每个更改的文件调用可视化diff程序。
对以前的伟大答案的简短总结:
git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false
然后通过键入(也可以选择指定文件名)使用它:
git difftool
要完成前面的“diff.external”配置回答:
正如Jakub所提到的,Git1.6.3引入了gitdifftool,最初于2008年9月提出:
用法=“[--工具=工具][--提交=参考][--开始=参考--结束=参考]][--无提示][要合并的文件]”(请参阅此答案的最后部分中的--extcmd)
$LOCAL包含起始修订版中的文件内容,$REMOTE包含结束修订版中文件的内容。$BASE包含世界中文件的内容
它基本上被修改为在git索引/工作树上操作。此脚本的通常使用情况是当您有暂存或未暂存的更改,并且希望在并排的diff查看器(例如xxdiff、tkdiff等)中查看更改时。
git difftool [<filename>*]
另一个用例是当您希望看到相同的信息,但比较任意提交时(这是revarg解析可能更好的部分)
git difftool --start=HEAD^ --end=HEAD [-- <filename>*]
最后一个用例是当您想将当前工作树与HEAD以外的其他东西(例如标记)进行比较时
git difftool --commit=v1.0.0 [-- <filename>*]
注意:由于Git2.5,Git-configdiff.toolwinmerge就足够了!请参阅“git mergetool winmerge”
从Git 1.7.11开始,您可以选择-dir diff,以便生成外部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.shscript:您可以自定义它以考虑特殊情况。
例如,请参见下面David Marble的回答,以获取处理以下问题的示例:
源或目标中的新文件已删除源或目标中的文件
正如Kem Mason在他的回答中提到的,您也可以通过使用--extcmd选项来避免任何包装器:
--extcmd=<command>
指定用于查看差异的自定义命令。gitdifftool忽略配置的默认值,并在指定此选项时运行$command$LOCAL$REMOTE。
例如,这就是gitk能够运行/使用任何diff工具的方式。
如果你在Mac上,并且有Xcode,那么你已经安装了FileMerge。终端命令是opendiff,因此您可以执行以下操作:
git difftool -t opendiff
推荐文章
- 当git说它正在“解析delta”时,它实际上在做什么?
- Git命令将一个文件夹移动到另一个文件夹
- 在单个文件中重新启动/撤消冲突解决方案
- Visual Studio代码如何解决合并冲突与git?
- 无法推送到远程分支,无法解析到分支
- Git:如何将数据库重置为特定的提交?
- 如何在合并期间使用Git和命令行保存本地文件或远程文件?
- 能够用一个命令推到所有git遥控器?
- 重新基于Git合并提交
- 忽略已经签入目录的内容?
- 如何从windows cmd保存git提交消息?
- (Mac) -bash: __git_ps1:命令未找到
- 如何删除多个已删除的文件在Git仓库
- 使用vimdiff查看所有' git diff '
- 如何拉特定的目录与git