2014-07-26 22 views
23

W moim repozytorium, jeśli wpisujęDlaczego `git diff` nie wywołuje narzędzia zewnętrznego diff?

$ git diff some-file 

lub

$ git difftool some-file 

uzyskać wyświetlanie w diff-końcowy. Myślę, że to nie powinno się zdarzyć, bo utworzyły zewnętrznego narzędzia diff, jak pokazano przez wyjście 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 

Plik git diff mowa w wierszu diff.external wygląda następująco

#!/bin/bash 

meld $2 $5 

Dlaczego git diff nie wywołuje meld?

mam ten sam problem, jeśli mogę ustawić wszystko tak, że git config -l ma następującą linię:

diff.tool = meld 

lub

diff.external = usr/bin/meld 

Uwaga: Inne repozytoria na moim komputerze nie mam ten problem.

pokrewne, ale nie równoważne, SO pytania:

  1. What is the difference between git diff and git difftool?
  2. Cannot make git diff use diff.external for external diff tool
+0

Dlaczego używasz drugiego i piątego argumentu? – merlin2011

+0

@ merlin2011: Rozumiem, że git diff przekazuje siedem argumentów do zewnętrznego narzędzia diff i to połączenie wymaga tylko dwóch z nich. – DanielSank

Odpowiedz

15

uzyskać wyświetlanie w diff-końcowy. I to nie powinno się zdarzyć, bo utworzyły zewnętrznego narzędzia diff

Tak, to powinien: diff.external jest "in-końcowej wyświetlaczu diff".

(od git config man page)

diff.external 

Jeśli zmienna ta konfiguracja jest ustawiona, diff pokolenie nie jest wykonywana przy użyciu wewnętrznego maszyny diff, ale stosując daną komendę.
Można zastąpić zmienną środowiskową GIT_EXTERNAL_DIFF.
Polecenie jest wywoływane z parametrami opisanymi w "git Diffs" w git (1). Uwaga: jeśli chcesz używać zewnętrznego programu różnicowego tylko w podzbiorze plików, możesz zamiast tego użyć gitattributes(5).

question you link wyjaśnia dlaczego meld nie będzie mógł grać rolę „zewnętrznego diff”.

Viewing a diff visually with another tool odbywa się:

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

meld mogą być skonfigurowane w systemie Windows jako difftool: patrz "Git Diff and Meld on Windows".


Jeśli chcesz skonfigurować meldunku dla git diff, można (on Ubuntu) use the diff.external, but with a wrapper script:

utworzyć plik o nazwie git-diff.sh, stosując następującą zawartość:

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

Zapisz do lokalizacji, takiej jak /usr/local/bin, nadającej jej uprawnienia do wykonywania:

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

Ostatnim krokiem jest otworzyć plik $HOME/.gitconfig i dodać po kilka linii:

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

Następnym razem wpiszesz git diff w projekcie Git z zmiany, uruchomi się Meld pokazując przeglądarkę różnicową o podzielonym panelu.
Należy zauważyć, że wymagane jest zamknięcie otwartego wystąpienia meldowania przed otwarciem następnej przeglądarki diff.

+3

'git difftool' wydaje się być rozwiązaniem. Próbowałem użyć skryptu otoki, ale z jakiegoś powodu to nie działa. – DanielSank

10

Wydaje się, że git diff (przynajmniej jak na git wersji 1.7.12.4) nie będzie działać coś innego niż wewnętrznym, konsola tylko diff na pliku, który znajduje się w „zarówno zmodyfikowanego” państwa. git mergetool działa jednak na takich plikach.

+1

To nadal jest prawda w wersji 1.9.1 Git, co za kłopot! Po prostu zmarnowałem godzinę próbując dowiedzieć się, dlaczego moje ustawienia konfiguracji git dla difftoolu nagle przestały działać. –

+2

Nadal w przypadku 'git wersji 2.5.4 (Apple Git-61)'. Konsolidacja tylko w 3-way-merge jest dość dużym problemem. Naprawdę istnieje ogromny niedobór narzędzi natywnych dla poręcznych konsoli.Wierzę, że ścieżka, którą podejdę, pozwoli gitowi zrzucić znaczniki konfliktu do plików, a następnie użyć prostego narzędzia, które napiszę, aby przetworzyć je, aby wygenerować czytelne wyniki różnicowe. –

+1

Aha! @ trebor-rude, właśnie uratowałeś moje zdrowie psychiczne zastanawiając się, dlaczego żaden z moich selekcji difftool nie działa – jaygooby

1

Zazwyczaj chcę tylko sprawdzić, czy zmiany, które zamierzam wprowadzić, są poprawne. Więc postępowałem zgodnie z procedurą sugerowaną here (podobną do tej, którą zauważył VonC). Jednak program git difftool nadal nie otwiera połączenia. Następnie utworzyłem pseudonim:

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

Zapisz to w pliku .bashrc lub .zshrc lub odpowiedniej konfiguracji dla powłoki. To zasadniczo porównuje stan oddziału z poprzednim zatwierdzeniem w oddziale.

Wykonaj git-diff, aby zobaczyć zmiany w pliku na podstawie pliku lub git-diff --dir, aby zobaczyć wszystkie zmiany w widoku katalogu.