Fare in modo che git diff --stat mostri il percorso completo del file


104

In fase di esecuzione git diff --statalcuni file sono elencati con il percorso completo dalla base del repository ma alcuni file sono elencati come:

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

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

Vorrei git diffelencare il percorso completo del file per tutti i file in modo che possa essere facilmente elaborato da uno script. C'è un modo git diffper mostrare sempre il percorso completo

Risposte:


108

Il git diffcomando accetta 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 potresti voler usare git diff-treedirettamente poiché è più un comando "idraulico", anche se sospetto che andrà tutto bene in entrambi i casi. Tieni presente che hai bisogno dello stesso testo extra con --statquando lo usi git diff-tree. La differenza essenziale tra l'uso della git diff"porcellana "front-end, e il git diff-treecomando plumbing, è che git diffcerca nelle impostazioni configurate opzioni come diff.renamesdecidere se eseguire il rilevamento della ridenominazione. Bene, questo, più il front-end git difffarà l'equivalente di git diff-indexse stai confrontando un commit con l'indice , per esempio. In altre parole, git diff legge la tua configurazione e invoca automaticamente l'impianto idraulico corretto .)


6
git diff --numstat è uguale a diff-tree
cmcginty,

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

@ jakub.g: buon punto. Basato su un po 'di ricerca nel sorgente git, questo è entrato in git 1.7.10.
torek

4
C'è un modo per globalizzarlo? Scriverlo ogni volta è pazzesco.
Rudie

@Rudie: ahimè, no: c'è una variabile di configurazione diff.statGraphWidthche puoi usare per impostare il --stat-graph-widthvalore, ma le altre sono predefinite per la larghezza del tuo terminale. (Quindi, risposta alternativa: "sì,
allarga la

22

Per l'elaborazione degli script, potrebbe essere meglio utilizzare uno dei seguenti:

# 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

Ognuno di questi diventa più utile per una robusta elaborazione degli script se combinato con l' -zopzione, che utilizza NULcome terminatori di campo.


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

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

18

Per gli utenti Bash, è possibile utilizzare la $COLUMNSvariabile per riempire automaticamente la larghezza del terminale disponibile:

git diff --stat=$COLUMNS

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

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

Per una soluzione più generica, è possibile utilizzare l'output di tput colsper determinare la larghezza del terminale.


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

@Rudie aggiungi export COLUMNSal tuo ~/.bashrc, e nel tuo ~/.gitconfigsotto [alias], aggiungismart-diff = ! "gitsmartdiff() { git diff $2 --stat=$COLUMNS,$COLUMNS; }; gitsmartdiff"
user151841

@ user151841 Solo questo cambia diff. Voglio che funzioni anche per fusioni e pull, ecc. (Non posso nemmeno farlo manualmente lì.) Non penso che GIT lo supporti.
Rudie

@Rudie Bene, dopo che il pull o l'unione è completo, puoi fare la differenza tra il precedente e il nuovo hash.
user151841

2
@ user151841 Certo, ma l'unione fornisce già un riepilogo delle statistiche. Senza parametri / config. Sarebbe fantastico se tutti i "riepiloghi delle statistiche" usassero la stessa configurazione.
Rudie

4

C'è un'opzione --name-only: git diff --name-only. L'opzione è supportata anche da altri comandi git come showe stash.

I percorsi non vengono abbreviati con l'opzione.


0

Ho creato il seguente alias git:

diffstat = ! "gitdiffstat() {  git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"

Legge il conteggio delle colonne dal tput colscomando. Il valore predefinito è diffing against master, ma puoi opzionalmente specificare un altro ramo.

$ git diffstat
 .gitalias | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

0

Una semplice soluzione che ho trovato è stata quella di fare questo: (funziona solo su * nix, scusa no osx)

git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"

Questa versione funziona per entrambi, ma non ha un bell'aspetto su OSX.

git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"

-1

Ho scoperto che il comportamento di diff --stat è cambiato da qualche parte intorno a git 1.7.10, dove in precedenza avrebbe accorciato i percorsi dei file a una larghezza fissa per impostazione predefinita - ora viene visualizzato quanto consentito dalla finestra del terminale. Se riscontri questo problema, assicurati di eseguire l'aggiornamento a 1.8.0 o più recente.

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.