Почему `git diff` не вызывает внешний инструмент diff?

В моем хранилище, если я наберу

$ git diff some-file

или же

$ git difftool some-file

Я получаю дисплей diff терминала. Я думаю, что это не должно происходить, потому что я настроил внешний инструмент сравнения, как показано в результате git config -l:

$ git config -l
user.name=blah blah
user.email=blah blah
http.sslverify=true
diff.external=/home/daniel/bin/git-diff  <--This is the important line
push.default=simple
core.filemode=false
core.editor=gedit
alias.tree=log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)
         %C(black)[%cr]%C(reset)  %x09%C(black)%an: %s %C(reset)'
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.url=https://daniel@skynet/git/pyle.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.daniel.remote=origin
branch.daniel.merge=refs/heads/daniel

Файл git-diff, указанный в diff.external линия выглядит так

#!/bin/bash

meld $2 $5

Почему не git diff вызывать слияние?

Я получаю такое же поведение, если я настрою все так, чтобы git config -l имеет следующую строку:

diff.tool = meld

или же

diff.external = usr/bin/meld

Примечание: другие репозитории на моей машине не имеют этой проблемы.

Связанные, но не эквивалентные, ТАК вопросы:

  1. В чем разница между git diff а также git difftool ?
  2. Невозможно заставить git diff использовать diff.external для внешнего инструмента diff

3 ответа

Решение

Я получаю дисплей diff терминала. Я этого не должен происходить, потому что я настроил внешний инструмент сравнения

Да, это должно быть: diff.external для "отображения diff в терминале".

(отgit config справочная страница)

diff.external

Если задана эта переменная конфигурации,генерация различий выполняется не с использованием внутреннего механизма различий, а с использованием данной команды.
Может быть отменено сGIT_EXTERNAL_DIFFпеременная окружения.
Команда вызывается с параметрами, как описано в разделе "git Diffs" в git(1). Примечание: если вы хотите использовать внешнюю программу сравнения только для подмножества ваших файлов, вы можете вместо этого использовать gitattributes(5).

Вопрос, на который вы ссылаетесь, объясняет почему meldне сможет сыграть роль "внешнего дифференциала".

Визуальный просмотр различий с помощью другого инструмента осуществляется с помощью:

git difftool --dir-diff shaOfHisCheckIn^!
git difftool --tool=meld --dir-diff shaOfHisCheckIn^!
git difftool -t meld -d shaOfHisCheckIn^!

meldможет быть настроен в Windows как difftool: см. " Git Diff and Meld в Windows ".


Если вы хотите настроить meld для git diff, вы можете (в Ubuntu) использоватьdiff.external , но с помощью скрипта-обёртки:

создать файл с именем git-diff.sh, используя следующий контент:

#!/bin/bash
meld "$2" "$5" > /dev/null 2>&1

Сохраните это в таком месте, как /usr/local/bin, предоставив ему исполняемые права:

$ sudo mv git-diff.sh /usr/local/bin/
$ sudo chmod +x /usr/local/bin/git-diff.sh

Последний шаг - открыть свой $HOME/.gitconfig файл и добавьте следующие несколько строк:

[diff]
        external = /usr/local/bin/git-diff.sh

В следующий раз, когда вы введете git diff в Git-проекте с изменениями, Meld будет запущен и покажет вам средство просмотра diff-панели.
Обратите внимание, что вам необходимо закрыть открытый экземпляр meld до открытия следующего средства просмотра diff.

Кажется, что git diff (по крайней мере, на git версия 1.7.12.4) не будет запускать ничего, кроме внутреннего, только для консоли diff, для файла, который находится в состоянии "оба изменены". git mergetool работает на таких файлах, хотя.

Я обычно просто хочу проверить, верны ли изменения, которые я собираюсь проверить. Поэтому я следовал процедуре, предложенной здесь (аналогично той, что была отмечена VonC). Тем не менее, работает git difftool до сих пор не открыл смесь. Затем я создал псевдоним:

alias git-diff='git difftool $(git rev-parse HEAD)'

Сохраните это в вашем.bashrc или.zshrc или соответствующем конфиге для вашей оболочки. Это существенно сравнивает состояние ветви с предыдущей фиксацией в ветви.

Сделать git-diff чтобы увидеть изменения для каждого файла или git-diff --dir чтобы увидеть все изменения в представлении каталога.

Другие вопросы по тегам