git: использовать визуальный diff (meld) только в графическом интерфейсе

git: использовать визуальный diff (meld) только в графическом интерфейсе

Я знаю, что могу указать внешнюю команду 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.

Связанный контент