Git的自动检测是脚本化的还是在某个Git可执行文件中?

nzrxty8p  于 2023-05-05  发布在  Git
关注(0)|答案(3)|浏览(242)

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

Git对difftool或mergetool的自动检测是脚本化的还是在一些Git可执行文件中?

lnxxn5zx

lnxxn5zx1#

它是在git-mergetool中编写的。我在我的副本的第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)
whitzsjs

whitzsjs2#

git mergetool man page中所述,

--tool=<tool>

指定的合并解决方案。
有效的合并工具包括:kdiff3、tkdiff、meld、xxdiff、emerge、vimdiff、gvimdiff、ecmerge、diffuse、tortoisemerge、opendiff和araxis。
那么,这份名单从何而来?
实际上,这些工具(及其自定义选项)在脚本中使用:

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

并由脚本git-mergetool使用,它基于git config merge.tool命令进行选择。
但是在git-mergetool--lib中有一些基于valid_tool()函数的“自动选择”:

valid_tool ()

它使用基于mergetool.<aMergeToolName>.cmd的get_merge_tool_cmd()。
如果该设置保留在某个git配置文件中...该工具将被选中。
正确...,Jakub Narę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
9udxz4iz

9udxz4iz3#

my 2009 answer相比,脚本(如git-mergetool--lib.sh)在Git 2.41(2023年第2季度)中发生了变化:
git mergetool“(man)和git difftoolman)学习一个新的配置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.tooldiff.tool时,默认工具的选择对DISPLAY变量敏感;在GUI会话中,如果找到GUI专用工具,则将提出GUI专用工具,否则将提出基于终端的工具。
这种“GUI优化”行为很重要,因为GUI可以对用户理解和正确完成非平凡冲突合并的能力产生巨大影响。
不久前引入了merge.guitooldiff.guitool配置选项,使用户能够在同一环境中配置GUI工具和非GUI工具(如果未配置GUI工具,则可以回退)。
不幸的是,为支持选择guitool而引入的--gui参数仍然是显式的。
当使用已配置的工具时,不存在与未配置工具的“如果我们在GUI环境中,建议使用GUI工具”行为等效的行为。
如xmqqmtb8jsej.fsf@gitster.g中所建议的,引入新的配置选项difftool.guiDefaultmergetool.guiDefault,支持一个特殊值“auto”,它会根据非空的DISPLAY值的存在来选择相应的工具或guitool。
还支持“true”表示“默认为guitool(除非在命令行上传递--no-gui)”,并在未指定这些新配置选项时将“false”作为以前的默认行为。
git config现在在其手册页中包括:

difftool.guiDefault

true设置为默认使用diff.guitool(相当于指定--gui参数),或将auto设置为选择diff.guitooldiff.tool,具体取决于是否存在DISPLAY环境变量值。默认值为false,其中必须显式提供--gui参数才能使用diff.guitool
git config现在在其手册页中包括:

mergetool.guiDefault

true设置为默认使用merge.guitool(相当于指定--gui参数),或将auto设置为选择merge.guitoolmerge.tool,具体取决于是否存在DISPLAY环境变量值。默认值为false,其中必须显式提供--gui参数才能使用merge.guitool
git difftool现在在其手册页中包括:
diff.guitool变量,而不是diff.tool。这可以使用配置变量difftool.guiDefault自动选择。--no-gui选项可用于覆盖这些设置。如果未设置diff.guitool,我们将按照merge.guitooldiff.toolmerge.tool的顺序进行回退,直到找到工具。
git mergetool现在在其手册页中包括:
这将覆盖以前的-g--gui设置或mergetool.guiDefault配置,并从配置的merge.tool变量读取默认合并工具。
示例:

git config merge.guitool myguitool
git config mergetool.myguitool.cmd "(printf \"gui \" && cat \"\$REMOTE\") >\"\$MERGED\""
git config mergetool.myguitool.trustExitCode true

相关问题