2012-05-05 12 views
59

Sul fare git diff --stat alcuni file sono elencati con il percorso completo dalla base repository, ma alcuni file sono elencati come:Fare git diff --stat spettacolo ricco percorso del file

.../short/path/to/filename. 

Questo è il percorso inizia con ... e solo a breve il percorso è mostrato.

Mi piacerebbe git diff elencare il percorso di file completo per tutti i file affinché possa essere facilmente elaborato da uno script. C'è qualche modo posso ottenere git diff per mostrare sempre il percorso completo

risposta

68

Il comando git diff assume valori opzionali per --stat:

--stat[=<width>[,<name-width>[,<count>]]] 
     Generate a diffstat. You can override the default output width for 
     80-column terminal by --stat=<width>. The width of the filename 
     part can be controlled by giving another width to it separated by a 
     comma. By giving a third parameter <count>, you can limit the 
     output to the first <count> lines, followed by ... if there are 
     more. 

     These parameters can also be set individually with 
     --stat-width=<width>, --stat-name-width=<name-width> and 
     --stat-count=<count>. 

(per lo scripting che si potrebbe desiderare di utilizzare git diff-tree direttamente dal momento che è più di un "impianto idraulico "comando, anche se ho il sospetto che starai bene in entrambi i modi.Tieni che hai bisogno dello stesso testo extra con --stat quando usi git diff-tree. La differenza essenziale tra l'utilizzo del front-end" porcellana "git diff e il comando idraulico git diff-tree è che git diff cerca le tue impostazioni configurate per o pzioni come diff.renames per decidere se effettuare il rinominare il rilevamento. Bene, questo, oltre al front-end git diff farà l'equivalente di git diff-index se per esempio stai confrontando un commit con l'indice. In altre parole, git difflegge il config e richiama automaticamente l'impianto idraulico a destra.)

+5

git diff --numstat è lo stesso albero diff – cmcginty

+1

Nota che per limitare la larghezza dell'ultima parte (+++/---) puoi usare un separato '--stat-graph-width =. ... interruttore. Nota anche che l'impostazione high '--stat-graph-width =' e '--stat-name-width =' non è abbastanza, devi anche impostare '--stat-width =' abbastanza grande da coprire i due. –

+0

@ jakub.g: buon punto. Basato su un po 'di scavo nella sorgente git, questo è andato con git 1.7.10. – torek

-1

ho scoperto che il comportamento di diff --stat cambiato da qualche parte intorno git 1.7.10 dove in precedenza si sarebbe abbreviare i percorsi dei file ad un larghezza fissa per impostazione predefinita - ora visualizza quanto consentirà la finestra del terminale. Se riscontri questo problema, assicurati di eseguire l'aggiornamento alla versione 1.8.0 o successiva.

11

Per gli utenti Bash, è possibile utilizzare la variabile $COLUMNS per compilare automaticamente la larghezza del terminale disponibile:

git diff --stat=$COLUMNS 

nomi di percorso molto lunghi potrebbero ancora essere troncati; in questo caso, è possibile ridurre la larghezza del +++/--- parte utilizzando --stat-graph-width, per esempio, questo limita a 1/5 della larghezza del terminale:

git show --stat=$COLUMNS --stat-graph-width=$(($COLUMNS/5)) 

Per una soluzione più generico, è potrebbe utilizzare l'output di tput cols per determinare la larghezza del terminale.

+2

C'è un modo per globalizzare '--stat = $ COLUMNS, $ COLUMNS'? Digitarlo ogni volta è pazzesco. – Rudie

+0

@Rudie aggiungi 'export COLUMNS' al tuo' ~/.bashrc', e nel tuo ~ ~/.gitconfig' sotto '[alias]', aggiungi 'smart-diff =! "gitsmartdiff() {git diff $ 2 --stat = $ COLUMNS, $ COLUMNS;}; gitsmartdiff" ' – user151841

+0

@ user151841 Che cambia solo' diff'. Voglio che funzioni anche per le fusioni e le estensioni. (Non riesco nemmeno a farlo manualmente lì.) Non credo che GIT lo supporti. – Rudie

9

Per l'elaborazione di script, potrebbe essere meglio utilizzare una delle seguenti opzioni:

# list just the file names 
git diff --name-only 
path/to/modified/file 
path/to/renamed/file 


# list the names and change statuses: 
git diff --name-status 
M  path/to/modified/file 
R100 path/to/existing/file path/to/renamed/file 


# list a diffstat-like output (+ed lines, -ed lines, file name): 
git diff --numstat 
1  0  path/to/modified/file 
0  0  path/to/{existing => renamed}/file 

Questi ciascuna diventare più pratico per robusto elaborazione dello script in combinazione con l'opzione -z, che utilizza NUL come terminatori di campo.

+0

Secondo i miei test non si riceve il percorso completo della risorsa utilizzando questi comandi. Per ora vedo solo percorsi relativi per i file cancellati. Non so se questo è solo il caso di questi file. – GCallie

+1

Tutti gli outpu restituiranno i percorsi relativi a 'git rev-parse --show-toplevel'. Il problema originale si riferiva a percorsi troncati, che è un problema in diffstats, in particolare per nomi di file lunghi o un valore basso per '--stat-name-width'. I comandi sopra non tronceranno i percorsi, ma mostreranno il percorso "completo" come richiesto, anche se ancora relativo alla radice del repository. – cmbuckley

+0

In effetti, hai ragione. Grazie per la tua risposta! – GCallie