Я знаю, что могу указать внешнюю команду diff, которая будет использоваться для git diff
:
[diff]
external =
Но когда я вхожу в консоль (без X), это не удается, потому что мой визуальный diff не может открыть дисплей (очевидно)
Как мне указать 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 в логическое значение true (точно так же, как [foo]bar в конфигурационном файле). Включение равно, но с пустым значением (например, 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
Например, задайте псевдоним в файле запуска оболочки
~/.bashrc
и перезагрузите оболочку:alias git=~/git-wrapper.sh
Обычное использование
git
:$ git diff
Он будет использоваться
<YOUR_DIFF_WRAPPER>
, если вы находитесь внутриX
, и будет использоваться по умолчаниюgit-diff
снаружиX
.