2010-11-22 12 views
12

Einer meiner Lieblings-Workflows mit SVN ist die Verwendung der Ordnervergleichsfunktion von Beyond Compare, um die Nettodifferenzen zwischen zwei Zweigen oder einem Zweig und dem Stamm zu sehen. Gibt es eine Möglichkeit, dies in git zu tun, ohne mehrere Klone desselben Repositorys manuell erstellen zu müssen?Verzeichnisvergleich von Git-Zweigen

Als ich diese Frage stelle, kommt es mir vor, dass ich ein Skript schreiben könnte, das den aktuellen Repo in ein temporäres Verzeichnis klonen würde, den gewünschten Zweig auschecken und dann BCompare.exe mit den zwei Verzeichnissen als Argumente aufrufen. Die Ordnervergleichsansicht wird aufgerufen mit

BCompare.exe path/to/folder1 path/to/folder2 

Klingt vernünftig? Könnte ich den zusätzlichen Klon löschen, nachdem ich mit Beyond Compare fertig bin?

+0

"Könnte ich den zusätzlichen Klon löschen ...?" warum würdest du nicht? – Cascabel

+0

Nun, im Idealfall würde ich gerne im Hintergrund starten, so dass ich weiterhin git im selben Terminal verwenden kann, um das Log usw. zu sehen. Damit bin ich mir nicht sicher, was ich feststellen würde Closed Vergleich und es ist sicher, den temporären Klon zu löschen. –

Antwort

2

Es klingt, als ob Sie bereits die richtige Antwort gefunden haben - verwenden Sie git clone und git checkout, um ein Verzeichnis zum Vergleichen einzurichten, und führen Sie dann BCompare.exe. Das folgende Skript könnte ein guter Ausgangspunkt sein. Diese

#!/bin/sh 
(        # execute in a subshell so you can continue 
           # working in the current shell 
    set -o xtrace    # bash setting that echos each command before it's executed 
    > /tmp/auto_bcompare_log # truncate existing log file 
    BRANCH="$1"    # get branch argument from command line 
    TEMPDIR=`mktemp -d`  # get a temp directory 
    CWD=`pwd`     # remember the current directory 
    git clone $CWD $TEMPDIR 
    cd $TEMPDIR 
    git checkout $BRANCH 
    cd $CWD 
    BCompare.exe $CWD $TEMPDIR 
    rm -rf $TEMPDIR 
) >> /tmp/auto_bcompare_log 2>&1 < /dev/null & # background and redirect 
               # stdout/stderr/stdin 
+0

Das hat mehr oder weniger für mich funktioniert.Ich habe das Protokollierungskram herausgenommen, weil ich es lieber in der Befehlszeile sehen würde, damit es mit msysgit funktioniert, und ich habe es zu einem Alias ​​gemacht. Das Schöne daran ist, dass es ein Alias ​​ist, dass Sie in jedem Verzeichnis des Repos und es funktioniert automatisch. Ich habe mich entschieden, nicht zu verwenden(), da ich immer & im Hintergrund laufen lassen kann. Alias ​​selbst ist im nächsten Kommentar. –

+0

git config --global alias.ddiff '! Sh -c "TWD =/ddiffmp; mkdir $ TWD; CWD =' pwd'; git Klon $ CWD/.git $ TWD; CD $ TWD; git Kasse $ 1; cd $ CWD; BComp.exe $ TWD $ CWD; rm -rf $ TWD; ' –

0

Nur git diff mit den Namen oder Hashes der Zweige, die Sie vergleichen möchten, einfach so. Tatsächlich können Sie zwei beliebige Commits mit ihren Hashes vergleichen.

+0

Und wenn ich die erzwungene Linearität der Inverse-Vergleiche von git diff und der willkürlichen Dateireihenfolge nicht mag, dann bin ich SOL? Ich weiß, dass ich auch 'git difftool b1 b2' kann, aber das gibt mir die Ordnervergleichsansicht nicht. –

+0

Hmm, tut mir leid, ich habe deine Frage nicht bekommen, ich dachte du versuchst nur zwei Commits zu vergleichen. Du verwendest beyondcompare als das Diff-Werkzeug, das ich vermute, oder? Leider kenne ich das nicht. – ustun

+1

@drhorrible: Ihre Frage ist eigentlich, wie Sie diese spezifische "Ordnervergleichsansicht" erhalten, nicht nur, wie Sie den Unterschied zwischen zwei Zweigen sehen können. Möchte bearbeiten, um das etwas klarer zu machen. – Cascabel

27

(Vergleich Verzeichnisse anstelle von Datei-für-Datei) sollte in Kürze verfügbar sein:
[ANNOUNCE] Git 1.7.11.rc1 Siehe:

"git difftool" gelernt, die "--dir-diff" Option externe diff-Tools, um zu laichen, dass kann zwei Verzeichnishierarchien zu einer Zeit nach dem Auffüllen von zwei temporären Verzeichnissen vergleichen, statt eine Instanz des externen Tools einmal pro Dateipaar.

Siehe „Patch difftool: teach difftool to handle directory diffs“, von diesen fork of git:

Wenn ‚difftool‘ genannt wird, eine Reihe von Commits zu vergleichen, die mehr als eine Datei ändern, öffnet es eine separate Instanz des Diff-Tool für jede Datei, die sich geändert hat.

Die neue Option '--dir-diff' kopiert alle geänderten Dateien an einen temporären Speicherort und führt ein Verzeichnis diff auf ihnen in einer einzigen Instanz des Diff-Tools aus.

+0

Wenn ich mehr als einmal upvote könnte ich das. Dies ist perfekt und sollte die akzeptierte Antwort sein. – joneshf

+0

OMG Das ändert mein Leben! – stdcall