Подтвердить что ты не робот

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

В моем репозитории, если я набираю

$ git diff some-file

или

$ git difftool some-file

Я получаю дисплей в терминальном режиме. Я думаю, что этого не должно произойти, потому что я установил внешний инструмент сравнения, как показано на выходе 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://[email protected]/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 не вызывает meld?

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

diff.tool = meld

или

diff.external = usr/bin/meld

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

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

4b9b3361

Ответ 1

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

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

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

diff.external

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

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

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

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

meld можно настроить в Windows как diffftool: см. Git Diff и Meld в Windows.


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

создайте файл с именем 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 будет запущен, показывая вам средство просмотра различий между панелями.
Обратите внимание, что вы должны закрыть открытый экземпляр meld перед тем, как откроется следующий просмотрщик различий.

Ответ 2

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

Ответ 3

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

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

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

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