2014-07-26 15 views
23

In meinem Repository, wenn ichWarum ruft `git diff` kein externes Diff-Tool auf?

$ git diff some-file 

oder

$ git difftool some-file 

geben bekomme ich den in-Terminal diff-Display. Ich denke, das sollte nicht passieren, weil ich ein externes Diff-Tool eingerichtet haben, wie durch die Ausgabe von git config -l gezeigt:

$ 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 

Die git-Diff-Datei in der Zeile sieht diff.external verwiesen wie diese

#!/bin/bash 

meld $2 $5 

Warum ruft git diff nicht melde auf?

bekomme ich das gleiche Verhalten, wenn ich die Dinge so einrichten, dass git config -l die folgende Zeile hat:

diff.tool = meld 

oder

diff.external = usr/bin/meld 

Hinweis: Andere Repositorys auf meinem Rechner nicht über dieses Problem.

Verwandte, aber nicht gleichwertig, SO Fragen:

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

Warum verwenden Sie das zweite und fünfte Argument? – merlin2011

+0

@ merlin2011: Mein Verständnis ist, dass Git Diff sieben Argumente in das externe Diff-Tool übergibt und dass meld nur zwei von ihnen benötigt. – DanielSank

Antwort

15

Ich bekomme die in-Terminal diff-Display. Ich sollte dies nicht passieren, weil ich ein externes Diff-Tool eingerichtet haben

Ja, es sollte: diff.external ist für "in-Terminal diff-Anzeige".

(von git config man page)

diff.external 

Wenn diese Konfigurationsvariable gesetzt ist, diff Generation wird unter Verwendung der internen diff Maschinen nicht durchgeführt, aber den gegebenen Befehl verwenden.
Kann mit der Umgebungsvariablen GIT_EXTERNAL_DIFF überschrieben werden.
Der Befehl wird mit Parametern aufgerufen, wie unter gitDiffs in git (1) beschrieben. Hinweis: Wenn Sie ein externes Diff-Programm nur für eine Teilmenge Ihrer Dateien verwenden möchten, sollten Sie stattdessen gitattributes(5) verwenden.

Der question you link erklärt, warum meld nicht der Lage wäre, die Rolle eines „externen diff“ zu spielen.

Viewing a diff visually with another tool mit getan:

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

meld kann auf Windows als difftool konfiguriert werden: "Git Diff and Meld on Windows" sehen.


Wenn Sie meld für git diff konfigurieren möchten, können Sie (on Ubuntu) use the diff.external, but with a wrapper script:

eine Datei git-diff.sh genannt erstellen, den folgenden Inhalt:

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

speichern dies zu einem Ort wie /usr/local/bin, gibt es ausführbare Rechte:

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

Der letzte Schritt ist Ihre $HOME/.gitconfig Datei zu öffnen, und fügen Sie die folgenden Zeilen:

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

Sie das nächste Mal git diff in einem Git-Projekt Typ mit Änderungen, Meld wird gestartet, zeigt Ihnen eine Split-Panel-Diff-Viewer.
Beachten Sie, dass Sie die geöffnete Instanz von meld schließen müssen, bevor der nächste Diff-Viewer geöffnet wird.

+3

'git difftool' scheint die Lösung zu sein. Ich habe versucht, ein Wrapper-Skript zu verwenden, aber aus irgendeinem Grund funktioniert das nicht. – DanielSank

10

Es scheint, dass git diff (zumindest ab git Version 1.7.12.4) nicht etwas anderes als die internen, konsolen nur diff auf eine Datei ausgeführt, die in dem „beide modifizieren“ Zustand ist. git mergetool arbeitet jedoch an solchen Dateien.

+1

Dies gilt immer noch mit Git Version 1.9.1, Was für ein Ärgernis! Ich habe gerade eine Stunde damit verschwendet, herauszufinden, warum meine git config-Einstellungen für difftool plötzlich nicht mehr funktionieren. –

+2

Immer noch der Fall auf 'git Version 2.5.4 (Apple Git-61)'. Der Konsolen-Nur-3-Weg-Merge-Workflow ist ein ziemlich großer Schwachpunkt. Es gibt wirklich einen großen Mangel an fähigen konsoleneigenen Diff-Tools.Ich glaube, der Weg, den ich nehmen werde, ist, git zu erlauben, die Konfliktmarker in die Akten zu entleeren, und dann ein einfaches Werkzeug zu verwenden, das ich schreibe, um diese zu bearbeiten, um lesbare Diff-Ausgaben zu erzeugen. –

+1

Aha! @ Trebor-unhöflich, du hast gerade meinen Verstand gerettet, weil ich mich gefragt habe, warum keine meiner verschiedenen Optionen funktioniert hat – jaygooby

1

Normalerweise möchte ich nur überprüfen, ob die Änderungen, die ich einchecke, korrekt sind. Also folgte ich dem vorgeschlagenen Verfahren here (ähnlich dem von VonC). Allerdings lief git difftool immer noch nicht meld. Ich habe dann einen Alias ​​erstellt:

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

Speichern Sie dies in Ihrem. Bashrc oder. Zshrc oder die entsprechende Konfiguration für Ihre Shell. Dies vergleicht im Wesentlichen den Zustand der Verzweigung mit dem vorherigen Festschreiben auf der Verzweigung.

Führen Sie eine git-diff aus, um Änderungen auf Dateibasis anzuzeigen, oder git-diff --dir, um alle Änderungen in einer Verzeichnisansicht anzuzeigen.

Verwandte Themen