git:仅在 GUI 中使用视觉差异(融合)

git:仅在 GUI 中使用视觉差异(融合)

我知道我可以指定外部 diff 命令用于git diff

[diff]
    external = 

但是当我登录控制台(没有 X)时,这会失败,因为我的视觉差异无法打开显示(显然)

我如何告诉 git 仅在登录 GUI/X 时才使用视觉差异?

答案1

有几种简单的方法可以实现这一点...要在 git 之外执行此操作,您可以将 difftool 程序(您可能需要 difftool 而不是 diff 来启动可视化差异)设置为包装器脚本,该脚本可以确定您是否是否在图形环境中并启动适当的程序;或者“内部”git,您可以执行一些特定于环境的条件包含(includeIf)。

答案2

您要求,an answer drawing from credible and/or official sources所以我将在这个答案中引用一些官方文档。

首先,我们需要找到一种方法来确定我们是否在X 会话内运行。例如,我们可以通过检查$DISPLAY 变量是否已设置来做到这一点。正如它所描述的man X

展示

这是唯一的强制环境变量。它必须指向 X 服务器。请参阅上面的“显示名称”部分。

然而,这可能不是一个好主意,因为有人 DISPLAY甚至可以在 之外设置一个假值X。中建议了更好的方法这个答案

if xhost >& /dev/null ; then echo "Display exists"
else echo "Display invalid" ; fi

您的计算机上应该已经安装了一个名为的程序xhost,请确保您拥有它:

$ type -a xhost
xhost is /usr/bin/xhost

现在,我们可以设置diff.external为指向一个包装器,如果我们在内部,则该包装器将调用外部 diff;如果我们不在内部,X则运行默认 机制。不幸的是,我无法想出一种简单的方法来运行默认值, 所以让我们为它创建一个临时使用的别名。如中所述:git diffXgit diffdiff.externalgitdiff.external-cman git

-c <名称>=<值>

将配置参数传递给命令。给定的值将覆盖配置文件中的值。预期格式与 git config 列出的格式相同(子键用点分隔)。

请注意,允许省略 git -c foo.bar ... 中的 = 并将 foo.bar 设置为布尔真值(就像配置文件中的 [foo]bar 一样)。包含 equals 但使用空值(如 git -c foo.bar= ...)将 foo.bar 设置为空字符串。

它会是这样的:

$ git -c diff.external=diff-wrapper.sh ...

总结:

  • 创建一个名为的脚本~/git-wrapper.sh并替换 <YOUR_DIFF_WRAPPER>为您想要的任何内容:

    #!/usr/bin/env sh
    
    if xhost >/dev/null 2>&1
    then
        git -c diff.external=<YOUR_DIFF_WRAPPER>  "$@"
    else
        git "$@"
    fi
    
  • 设置可执行位:

     $ chmod +x ~/git-wrapper.sh
    
  • 例如,在 shell 启动文件中设置别名~/.bashrc并重新加载 shell:

     alias git=~/git-wrapper.sh
    
  • 正常使用git

     $ git diff
    

    <YOUR_DIFF_WRAPPER>如果您在内部,它将使用它,并且将在外部X使用默认值。git-diffX

相关内容