git difftool, apri immediatamente tutti i file diff, non in seriale


240

Il comportamento predefinito di git diff è quello di aprire ogni file diff in seriale (attendere la chiusura del file precedente prima di aprire il file successivo).

Sto cercando un modo per aprire tutti i file contemporaneamente: in BeyondCompare, ad esempio, questo aprirebbe tutti i file nelle schede all'interno della stessa finestra BC.

Ciò faciliterebbe la revisione di una serie complessa di modifiche; scorrere avanti e indietro tra i file diff e ignorare i file non importanti.


"git diff" o "git difftool"? Potresti voler inviare una richiesta su (aperto a tutti e con una variegata interfaccia web) mailing list git: git@vger.kernel.org
Jakub Narębski

Sto usando "git difftool" per attivare l'applicazione diff esterna. Grazie per l'idea della mailing list.
Seba Illingworth,

Sarebbe utile conoscere la piattaforma. Su una piattaforma basata su Unix, scriverei uno script per eseguire il diff e dare istruzioni a git di usare quello script. Nella sceneggiatura, eseguivo semplicemente il diff in background e poi lasciavo morire la sceneggiatura.
Chris Cleeland,

Piattaforma Windows, ma grazie per le idee Chris.
Seba Illingworth,

Risposte:


214

A partire da gitv1.7.11, è possibile utilizzare git difftool --dir-diffper eseguire una directory diff.

Questa funzionalità funziona bene con Meld 3.14.2 per esempio e consente di sfogliare tutti i file modificati:

git difftool --dir-diff --tool=meld HEAD~ HEAD

Questa è una pratica funzione Bash:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

La risposta che segue si applica alle gitinstallazioni precedenti alla v1.7.11.


La stessa domanda è stata posta nella mailing list di git .

Ho messo insieme uno script di shell basato su quel thread e-mail che esegue una directory diff tra commit arbitrari.

A partire da git v1.7.10, lo git-diffallscript è incluso contribnell'installazione standard di git.

Per le versioni precedenti alla v1.7.10, è possibile installare dal git-diffallprogetto su GitHub .

Ecco la descrizione del progetto:

Lo script git-diffall fornisce un meccanismo diff basato su directory per git. Lo script si basa sull'opzione di configurazione diff.tool per determinare quale visualizzatore diff viene utilizzato.

Questo script è compatibile con tutti i moduli utilizzati per specificare una serie di revisioni per diff:

1) git diffall: mostra la differenza tra l'albero di lavoro e le modifiche in scena
2) git diffall --cached [<commit>]: mostra la differenza tra le modifiche in scena e HEAD (o altri commit con nome)
3) git diffall <commit>: mostra la differenza tra l'albero di lavoro e il commit con nome
4) git diffall <commit> <commit>: mostra la differenza tra due commit con nome
5) git diffall <commit>..<commit>: stesso come sopra
6) git diffall <commit>...<commit>: mostra le modifiche sul ramo contenente e fino al secondo, a partire da un antenato comune di entrambi<commit>

Nota: tutti i moduli hanno un limitatore di percorso opzionale [--] [<path>]

Questo script si basa su un esempio fornito da Thomas Rast nell'elenco Git .


Qual è la differenza tra git-diffall e github.com/wmanley/git-meld ? Ho provato entrambi e sembrano fornire funzionalità identiche a prima vista.
kynan,

5
Innanzitutto apprezzo molto la tua sceneggiatura. Francamente, non riesco a capire perché Git non si comporti nel modo giusto in questo senso (lo fa Mercurial, e lo fa da anni), né posso capire la mancanza di interesse da parte della comunità Git.
Douglas,

6
Aggiornamento (per quanto riguarda git difftool --dir-diffBeyond Compare): ho contattato Scooter Software (autori di Beyond Compare) e dicono che bcompare.exenon è una soluzione supportata e possono causare problemi se è presente più di una diff alla volta. Hanno in programma di aggiungere il supporto per le differenze di cartella bcomp.exein una versione futura (nel frattempo, continuerò a utilizzare bcompare.execome soluzione alternativa non supportata).
Peter Rust,

4
@coin Ho appena provato con Beyond Compare 4 e --dir-diff sembra funzionare con il bcomp.exe supportato.
Peter Rust,

5
Sto solo commentando per dire che --dir-difffunziona perfettamente con Meld. Da lì, ti permetterà di selezionare e visualizzare le differenze per i singoli file.
mkasberg,

61

Ecco cosa ho deciso di ...

Copia il seguente codice in un file chiamato git-diffall(nessuna estensione):

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

Inserisci il file nella cmdcartella della tua directory di installazione di git (ad es. C:\Program Files (x86)\Git\cmd)

E usalo come faresti git diff:

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

Note: la chiave è il parametro & che indica al comando diff esterno di essere eseguito in un'attività in background in modo che i file vengano elaborati immediatamente. Nel caso di BeyondCompare questo apre una schermata con ogni file nella sua scheda.


Grazie per la pubblicazione. Sfortunatamente, non funziona con l'opzione -s di WinMerge. Tutti i file temporanei tranne il primo vengono eliminati prima che WinMerge riesca a guardarli.
Carlos Rendon,

Carlos: Uso WinMerge con Git. Il mio approccio era quello di aggiungere un 'sleep 1' dopo aver avviato WinMerge (che nel mio caso sembra già avviarsi "in background" - non è necessario &). In questo modo il file temporaneo è abbastanza lungo da consentire a WinMerge di recuperarlo una volta (tranne in casi strani). Significa anche che ci vogliono 1 secondo per file per aprirli tutti. È un brutto trucco (non lo presenterei mai come una "risposta"!), Ma facile, abbastanza efficace.
Woody Zenfell III,

2
Per l'uso su Linux, con Git 2.x, ho dovuto apportare una leggera modifica: passare "$filename"a "../$filename". Quindi ha funzionato perfettamente con Beyond Compare
Dave C,

1
@DaveC nel thread originale dice "archivia il file nella cartella cmd della tua installazione git" e procede con un esempio su Windows. Dove hai archiviato il file "git-diffall" in Linux?
m4l490n,

2
Dobbiamo riavviare Windows dopo aver aggiunto il git-diffallfile alla C:\Program Files\Git\cmdcartella? Ho fatto esattamente come indicato ma dopo aver fatto $ git diffall git: 'diffall' is not a git command. See 'git --help'. Did you mean this? difftool
nesdis il

19

meld ha una caratteristica ordinata che se gli dai una directory sotto il controllo del codice sorgente (Git, Mercurial, Subversion, Bazaar e probabilmente altri) elencherà automaticamente tutti i file modificati e puoi fare doppio clic per visualizzare le singole differenze.

IMO è molto più facile da digitare meld .e far capire a VCS che configurare VCS per l'avvio meld. Inoltre, puoi usare lo stesso comando, indipendentemente dal VCS utilizzato dal tuo progetto, il che è fantastico se passi da uno all'altro.

L'unico aspetto negativo è che è più lento per la scansione cercare le modifiche piuttosto che passare le modifiche da git / hg / svn, anche se sono sicuro che sia abbastanza lento da essere un problema dipenderà da come lo stai usando.


4
Per me il principale svantaggio è che la fusione (per qualsiasi motivo) apre il diff in una nuova finestra anziché in una nuova scheda e dopo aver chiuso il diff, il file nella directory di lavoro si apre in una nuova scheda con un fastidioso messaggio popup prima.
kynan,

bellissimo strumento ma orribile installazione di Windows (all'inizio del 2012).
Wernight,

@kynan Questa sembra la soluzione perfetta per un modo agnostico VCS di differire se non per quella fastidiosa cosa del popup a doppia finestra. È un peccato. :(
PKKid

Una grande caratteristica di meld sono i suoi filtri diff: ignora le modifiche, ad esempio nei commenti o aggiungi / rimuovi le righe vuote, che git diffnon offrono.
Kynan,

1
Ho usato questo approccio per circa un anno; funziona bene per i progetti più piccoli ma una volta che hai un grande progetto (cioè molti file) è incredibilmente lento poiché "scansiona" manualmente per git diff (non sono sicuro del motivo per cui adotta questo approccio quando git chiaramente può fornire un elenco di file direttamente ...)
namuol il

3

Ho trovato questo metodo (GitDiff.bat e GitDiff.rb) che copia i file su vecchie / nuove directory temporanee e quindi confronta una cartella su di essi.

Ma preferirei visualizzare direttamente i file di lavoro (dalla directory di lavoro), poiché BeyondCompare ha la comoda funzione di poter modificare il file all'interno della finestra diff che è l'ideale per una rapida pulizia.

Modifica: un metodo simile qui in risposta alla mia domanda sulla mailing list git.



2

Notato qui che Araxis Merge ha un'opzione di comando '-nowait':

-nowait Impedisce al confronto di attendere la chiusura di un confronto

Forse questo restituisce un codice di uscita immediato e funzionerebbe, qualcuno l'ha sperimentato? Impossibile trovare un'opzione simile per BeyondCompare ...


2

Diffuse ha anche l'integrazione VCS. Interagisce con una pletora di altri VCS, tra cui SVN, Mercurial, Bazaar, ... Per Git, mostrerà anche tre riquadri se vengono messi in scena alcuni ma non tutti i cambiamenti. In caso di conflitti, ci saranno anche quattro riquadri.

Schermata di diffusa con modifiche in scena e non in scena

Invocalo con

diffuse -m

nella tua copia di lavoro di Git.

Se me lo chiedi, la migliore differenza visiva che abbia mai visto per un decennio. (E ho provato anche la fusione.)


Puoi dire quale parte del diffuso ti è piaciuta, specialmente sulla fusione?
musiphil,

@musiphil: mi piace la sua semplicità: sembra che abbia l'esatto set di funzionalità necessarie per risolvere il compito, non di più, ma anche non di meno. (Come il riallineamento delle differenze e l'ampiezza della dimensione della scheda.) Non ricordo perché sono passato dalla fusione, e da allora non ho più usato la fusione, quindi non posso davvero confrontarli adesso.
krlmlr,

1
Diffuse ha funzionato con git senza alcuna configurazione. Diffuse -m apre una singola finestra con git diff in diverse schede; mentre altri strumenti necessitano di troppa configurazione per iniziare.
mosh

1

Se tutto ciò che vuoi fare è aprire tutti i file che sono attualmente modificati, prova qualcosa del tipo:

vi $ (stato git | sed -n '/.*modificato: * / s /// p')

Se stai eseguendo il commit di "serie complesse di modifiche", potresti voler riconsiderare il flusso di lavoro. Una delle caratteristiche davvero interessanti di git è che rende facile per lo sviluppatore ridurre serie di modifiche complesse a una serie di semplici patch. Invece di provare a modificare tutti i file che sono attualmente modificati, potresti voler esaminare

git add --patch
che ti permetterà di mettere in scena selettivamente hunk.


1

Ho scritto uno script PowerShell che duplicherà due alberi di lavoro e lo confronterà con DiffMerge. Quindi puoi fare:

GitNdiff master~3 .

Per confrontare il ramo principale tre check-ago fa con l'attuale albero di lavoro, ad esempio.

È brillante e nuovo e probabilmente pieno di bug. Uno svantaggio è che i file dell'albero di lavoro che non sono stati ancora aggiunti vengono copiati in entrambi gli alberi di lavoro. Può anche essere lento.

http://github.com/fschwiet/GitNdiff


1

Per coloro che sono interessati all'utilizzo di git-diffall su Mac OS X con Araxis, ho modificato il progetto git-diffall su github e ho aggiunto un AppleScript che racchiude il comando Araxis Merge. Nota: questo è un clone leggermente modificato del araxisgitdifffile fornito con Araxis Merge per Mac OS X.

https://github.com/sorens/git-diffall


1

Quanto segue funziona con meld e kdiff3

git difftool --dir-diff origin/branch1..origin/branch2

Apre tutti i file in una finestra che puoi sfogliare facilmente. Può essere utilizzato con i changeset al posto di origine / nome-ramo

per esempio: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1


-2

Puoi usare gitk e vedere tutte le differenze allo stesso tempo


3
Sì, trovo utile gitk, ma quando si tratta di diff. BC è quello che voglio vedere :)
Seba Illingworth,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.