是Git的自动检测脚本或者是一些Git的可执行文件中?(Is Git's auto-dete

2019-06-24 12:54发布

这个问题是基于在VonC的评论线程 。

是Git的自动检测difftool或合并工具脚本或者是一些Git的可执行文件中?

Answer 1:

它的脚本在混帐合并工具。 我发现这个在我的副本344线。

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)


Answer 2:

正如所提到的git合并工具手册页 ,

--tool=<tool>

通过使用指定的合并决议的程序。
有效的合并工具有:kdiff3,tkdiff,合并,xxdiff,出现,vimdiff同时,gvimdiff,ecmerge,弥漫性,TortoiseMerge中,了opendiff和araxis。

现在,哪里该列表从何而来?

事实上,这些工具(和他们的自定义选项)在脚本中使用:

<Git>/libexec/git-core/git-mergetool--lib

并且由脚本GIT-合并工具,它不基于所述选择git config merge.tool命令。

但有一点基础的混帐合并工具的valid_tool()函数“自动选择”的 - lib目录下:

valid_tool ()

它使用get_merge_tool_cmd(),它是基于mergetool.<aMergeToolName>.cmd
如果设置留在混帐配置文件中的一个......该工具会被选中。


右... 的JakubNarębski只是指出了正确的部分git-mergetool--lib脚本:

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"
}

这个功能恰当地命名guess_merge_tool()你觉得我应该能找到它...)不除其他事情,下面,这可以解释它检测到了opendiff:

# 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


文章来源: Is Git's auto-detection scripted or is it within some Git executable?