Почему `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
Примечание: другие репозитории на моей машине не имеют этой проблемы.
Связанные, но не эквивалентные, ТАК вопросы:
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
чтобы увидеть все изменения в представлении каталога.