当我键入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++定义为外部编辑器。
尝试此解决方案:
$ meld my_project_using_git
Meld了解Git,并提供最近更改的导航。
如果你恰好已经有一个与文件类型相关的diff工具(比如,因为你安装了TortoiseSVN,它附带了一个diff查看器),你可以将常规的git diff输出通过管道发送到一个“temp”文件,然后直接打开该文件,而无需了解查看器:
git diff > "~/temp.diff" && start "~/temp.diff"
将其设置为全局别名效果更好:gitwhat
[alias]
what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"
对以前的伟大答案的简短总结:
git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false
然后通过键入(也可以选择指定文件名)使用它:
git difftool
在VonC解决文件删除和添加问题的基础上,使用以下命令和脚本:
git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\" \"$BASE\""
git config --global difftool.prompt false
这与将其放在全局文件.gitconfig:
[diff]
tool = winmerge
[difftool "winmerge"]
cmd = winmerge.bat "$LOCAL" "$REMOTE" "$BASE"
[difftool]
prompt = false
然后将以下内容放入文件winmerge.sh中,该文件必须位于您的路径上:
#!/bin/sh
NULL="/dev/null"
if [ "$2" = "$NULL" ] ; then
echo "removed: $3"
elif [ "$1" = "$NULL" ] ; then
echo "added: $3"
else
echo "changed: $3"
"C:/Program Files (x86)/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$1" "$2"
fi
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解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之间的区别