if test -z "$merge_tool"; then
merge_tool=`git config merge.tool`
if test -n "$merge_tool" && ! valid_tool "$merge_tool"; then
echo >&2 "git config option merge.tool set to unknown tool: $merge_tool"
echo >&2 "Resetting to default..."
unset merge_tool
fi
fi
if test -z "$merge_tool" ; then
if test -n "$DISPLAY"; then
merge_tool_candidates="kdiff3 tkdiff xxdiff meld gvimdiff"
if test -n "$GNOME_DESKTOP_SESSION_ID" ; then
merge_tool_candidates="meld $merge_tool_candidates"
fi
if test "$KDE_FULL_SESSION" = "true"; then
merge_tool_candidates="kdiff3 $merge_tool_candidates"
fi
fi
if echo "${VISUAL:-$EDITOR}" | grep 'emacs' > /dev/null 2>&1; then
merge_tool_candidates="$merge_tool_candidates emerge"
fi
(snip)
get_merge_tool () {
# Check if a merge tool has been configured
merge_tool=$(get_configured_merge_tool)
# Try to guess an appropriate merge tool if no tool has been set.
if test -z "$merge_tool"; then
merge_tool="$(guess_merge_tool)" || exit
fi
echo "$merge_tool"
}
# Loop over each candidate and stop when a valid merge tool is found.
for i in $tools
do
merge_tool_path="$(translate_merge_tool_path "$i")"
if type "$merge_tool_path" > /dev/null 2>&1; then
echo "$i"
return 0
fi
done
3条答案
按热度按时间lnxxn5zx1#
它是在git-mergetool中编写的。我在我的副本的第344行找到了这个。
whitzsjs2#
如git mergetool man page中所述,
指定的合并解决方案。
有效的合并工具包括:kdiff3、tkdiff、meld、xxdiff、emerge、vimdiff、gvimdiff、ecmerge、diffuse、tortoisemerge、opendiff和araxis。
那么,这份名单从何而来?
实际上,这些工具(及其自定义选项)在脚本中使用:
并由脚本git-mergetool使用,它基于
git config merge.tool
命令进行选择。但是在git-mergetool--lib中有一些基于valid_tool()函数的“自动选择”:
它使用基于
mergetool.<aMergeToolName>.cmd
的get_merge_tool_cmd()。如果该设置保留在某个git配置文件中...该工具将被选中。
正确...,Jakub Narębski刚刚指出了
git-mergetool--lib
脚本中的正确部分:这个函数被恰当地命名为**
guess_merge_tool()
**(你认为我应该能找到它!)...)做了以下事情,这可以解释它检测到opendiff:9udxz4iz3#
与my 2009 answer相比,脚本(如
git-mergetool--lib.sh
)在Git 2.41(2023年第2季度)中发生了变化:“
git mergetool
“(man)和git difftool
(man)学习一个新的配置guiDefault
,以便在设置$DISPLAY
时自动选择使用配置的guitool而不是非gui-tool。参见commit 42943b9(2023年3月18日),作者Tao Klerks (
TaoK
)。(由Junio C Hamano --
gitster
--合并于commit 9d8370d,2023年4月17日)mergetool
:新配置guiDefault支持通过DISPLAY自动切换gui签字人:陶·克拉克
导演:大卫阿吉拉尔
当没有配置或手动选择
merge.tool
或diff.tool
时,默认工具的选择对DISPLAY
变量敏感;在GUI会话中,如果找到GUI专用工具,则将提出GUI专用工具,否则将提出基于终端的工具。这种“GUI优化”行为很重要,因为GUI可以对用户理解和正确完成非平凡冲突合并的能力产生巨大影响。
不久前引入了
merge.guitool
和diff.guitool
配置选项,使用户能够在同一环境中配置GUI工具和非GUI工具(如果未配置GUI工具,则可以回退)。不幸的是,为支持选择guitool而引入的
--gui
参数仍然是显式的。当使用已配置的工具时,不存在与未配置工具的“如果我们在GUI环境中,建议使用GUI工具”行为等效的行为。
如xmqqmtb8jsej.fsf@gitster.g中所建议的,引入新的配置选项
difftool.guiDefault
和mergetool.guiDefault
,支持一个特殊值“auto”,它会根据非空的DISPLAY
值的存在来选择相应的工具或guitool。还支持“
true
”表示“默认为guitool(除非在命令行上传递--no-gui
)”,并在未指定这些新配置选项时将“false
”作为以前的默认行为。git config
现在在其手册页中包括:difftool.guiDefault
将
true
设置为默认使用diff.guitool
(相当于指定--gui
参数),或将auto
设置为选择diff.guitool
或diff.tool
,具体取决于是否存在DISPLAY
环境变量值。默认值为false
,其中必须显式提供--gui
参数才能使用diff.guitool
。git config
现在在其手册页中包括:mergetool.guiDefault
将
true
设置为默认使用merge.guitool
(相当于指定--gui
参数),或将auto
设置为选择merge.guitool
或merge.tool
,具体取决于是否存在DISPLAY
环境变量值。默认值为false
,其中必须显式提供--gui
参数才能使用merge.guitool
。git difftool
现在在其手册页中包括:diff.guitool
变量,而不是diff.tool
。这可以使用配置变量difftool.guiDefault
自动选择。--no-gui
选项可用于覆盖这些设置。如果未设置diff.guitool
,我们将按照merge.guitool
、diff.tool
、merge.tool
的顺序进行回退,直到找到工具。git mergetool
现在在其手册页中包括:这将覆盖以前的
-g
或--gui
设置或mergetool.guiDefault
配置,并从配置的merge.tool
变量读取默认合并工具。示例: