当我键入git diff
命令时,我希望使用我选择的可视化差异工具(Windows上的SourceGear "diffmerge")查看输出。如何配置git以实现这一点?
当我键入git diff
命令时,我希望使用我选择的可视化差异工具(Windows上的SourceGear "diffmerge")查看输出。如何配置git以实现这一点?
也许这篇文章可以帮到你。以下是最好的部分:
有两种不同的方法来指定外部差异工具。
第一种方法是你使用的方法,通过设置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)--
正如您所见,仅第二个(“old-file”)和第五个(“new-file”)参数将传递给diff工具。
2)类型
$ git config --global diff.external <path_to_wrapper_script>
<path/to/git-diff-wrapper.sh>
”替换为路径,以便您的~/.gitconfig包含以下内容:-->8-(snip)--
[diff]
external = <path_to_wrapper_script>
--8<-(snap)--
请确保使用正确的语法来指定包装脚本和差异工具的路径,即使用正斜杠而不是反斜杠。在我的情况下,我有
[diff]
external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"
在 .gitconfig 中
"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat
在包装脚本中。注意末尾的"cat"!
(我想 '| cat
' 仅对某些可能不返回正确或一致返回状态的程序是必需的。如果您的差异工具具有显式返回状态,则可以尝试省略结尾的 cat)
(Diomidis Spinellis 在评论中补充道:
需要
cat
命令,因为diff(1)
默认退出并显示错误代码,如果文件不同。
Git希望外部差异程序只有在出现实际错误时才退出并显示错误代码,例如如果它运行内存不足。
通过将git
的输出传输到cat
,可以掩盖非零错误代码。
更有效的方法是,程序只能运行exit
并带有一个参数为 0。)
上述文章引用的是通过配置文件定义外部工具的理论(而不是通过环境变量)。
在实践中(仍然针对配置文件定义的外部工具),您可以参考以下内容:
为了补充我之前的"diff.external" config answer:
正如Jakub所提到的, Git1.6.3引入了git difftool, 最初在2008年9月提出:
用法='[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(请参阅此答案最后部分的--extcmd
)
$LOCAL
包含起始修订版文件的内容,$REMOTE
包含结束修订版文件的内容。
$BASE
包含工作树中文件的内容。
它基本上是修改后的
git-mergetool
,用于操作git索引/工作树。这个脚本的常见用例是当您有已暂存或未暂存的更改,并且希望在并排的差异查看器(例如
xxdiff
,tkdiff
等)中查看更改时。
git difftool [<filename>*]
git difftool --start=HEAD^ --end=HEAD [-- <filename>*]
git difftool --commit=v1.0.0 [-- <filename>*]
注意:自Git 2.5以来,git config diff.tool winmerge
就足够了!
请参见 "git mergetool winmerge"
而且,自Git 1.7.11开始,您可以使用选项--dir-diff
,以便在填充两个临时目录后,生成可以比较两个目录层次结构的外部diff工具,而不是针对每个文件对运行外部工具实例。
Git 2.5之前:
使用自定义差异工具配置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"
winmerge.sh
脚本:您可以根据特殊情况自定义它。Kem Mason在他的回答中提到,您还可以使用--extcmd
选项避免使用任何包装器:
--extcmd=<command>
指定自定义命令以查看差异。当指定此选项时,
git-difftool
忽略配置的默认值并运行$command $LOCAL $REMOTE
。
例如,这就是gitk
能够运行/使用任何 diff
工具的方式。
git config --global difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\""
- Carlos Rendon--start=
和--end=
选项无法识别。 - Michaelmeld .
жҜ”й”®е…Ҙgit difftool
并жҢүйЎәеәҸжҹҘзңӢжӣҙж”№зҡ„ж–Ү件иҰҒе®№жҳ“еҫ—еӨҡгҖӮиҝҷжӣҙжҺҘиҝ‘дәҺMercurialзҡ„hg vdiff
жҸ’件гҖӮ - Tommeld .
在 Mercurial 和 Subversion 项目中也适用,如果有人感兴趣的话。 - Tomgit difftool -y -t meld --dir-diff other_branch
也很有用,可以查看与任何分支的不同之处。 - Eric Duminil使用新的git difftool,只需在您的.gitconfig文件中添加以下内容即可:
[diff]
tool = any-name
[difftool "any-name"]
cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""
另外,也可以选择添加:
[difftool]
prompt = false
此外,还可以查看 diffall ,这是我编写的一个简单脚本,用于扩展在串行中打开每个文件的烦人(依我之见)的默认diff行为。
Windows上的全局.gitconfig位于%USERPROFILE%\.gitconfig
中。
git difftool -t kdiff3 HEAD
- emanaton我有一个补充。我喜欢定期使用一些不被默认工具支持的 diff 应用程序(例如 kaleidoscope),通过
git difftool -t
我还希望默认的diff
命令行工具保持原样,所以设置GIT_EXTERNAL_DIFF
变量不是一个选项。
你可以使用以下命令临时使用任意的diff
应用程序:
git difftool --extcmd=/usr/bin/ksdiff
它只是将您指定的命令传递给这两个文件,因此您可能不需要包装器。
在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
winmerge.bat
in the second snippet should be winmerge.sh
- BartoszKP在阅读了答案之后,我发现有一种更简单的方法,只需要更改一个文件。
创建一个批处理文件来调用您的diff程序,并传递参数2和5。这个文件必须放在您的路径中的某个地方。(如果你不知道在哪里,放在C:\windows里。)例如,称之为“gitdiff.bat”。我的是:
@echo off
REM This is gitdiff.bat
"C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
设置环境变量指向你的批处理文件。例如:GIT_EXTERNAL_DIFF=gitdiff.bat
。或通过 PowerShell 输入 git config --global diff.external gitdiff.bat
。
重要的是不要使用引号或指定任何路径信息,否则它将无法工作。这就是为什么gitdiff.bat必须在您的路径中。
现在当你输入“git diff”时,它会调用你的外部差异查看器。git config --global diff.external winmerge.cmd
,而不是设置GIT_EXTERNAL_DIFF
环境变量,它同样有效。 - Christoffer Lette$ git config difftool.bc3.cmd "git-diff-bcomp-wrapper.sh \$LOCAL \$REMOTE"
$ cat git-diff-bcomp-wrapper.sh
#!/bin/sh
"c:/Program Files (x86)/Beyond Compare 3/BComp.exe" `cygpath -w $1` `cygpath -w $2`
在查看了其他一些外部的差异工具之后,我发现IntelliJ IDEA(和Android Studio)中的diff
视图最适合我。
如果您想使用IntelliJ IDEA作为差异工具,您应该首先按照这里的说明设置从命令行运行IntelliJ IDEA:
在macOS或UNIX上:
Tools | Create Command-line Launcher
。打开Create Launcher Script对话框,并提供了默认的路径和启动器脚本的名称建议。您可以接受默认值,也可以指定自己的路径。
记住它,因为稍后会用到。在Windows上:
按照这篇博客文章中的说明:
Bash
export INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
PATH=$IDEA_HOME $PATH
鱼
set INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
set PATH $INTELLIJ_HOME $PATH
[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")
git difftool
或git difftool HEAD~1
来尝试它。
git difftool -tool=opendiff
命令并将opendiff
替换为任何其他工具。 - potenchgit config diff.tool winmerge
。通过输入git difftool
来验证它是否可用。通过输入git config --global difftool.prompt false
来取消提示。我建议使用 p4merge 而不是 winmerge。 - Michael S.