我知道我可以指定外部 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 diff
X
git diff
diff.external
git
diff.external
-c
man 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-diff
X