2011-12-23 9 views
35

Qual è il one-liner più semplice per ottenere l'ultima data di commit per un gruppo di file in un repository Git (ad esempio, per ogni file, la data dell'ultimo commit che ha modificato quel file)?Come ottenere l'ultima data di commit per un gruppo di file in Git?

Il contesto per questo è che sto usando altri comandi di Bash per trovare una lunga lista di file che corrispondono ad alcuni criteri, e vorrei semplicemente reindirizzare questa lista in un comando Git per ottenere l'ultima data di commit per ogni file.

+0

Sei mai stato in grado di creare un alias git o qualunque cosa faccia uscire le date di commit di un gruppo di file? Ho una cartella principale con file e cartelle/file, ecc. Voglio vedere l'ultima volta che qualcosa in quella cartella è cambiato. – Terry

risposta

60

Il seguente comando sarà utile:

git log -1 --format=%cd filename.txt 

Questo stamperà l'ultima data di modifica per un file. -1 mostra una voce di registro (la più recente) e --format=%cd mostra la data di commit. Vedere la documentazione per git-log per una descrizione completa delle opzioni.

Dovresti essere in grado di estenderlo facilmente per un gruppo di file.

+1

Ciò è utile. C'è un modo migliore per allegare il nome di ciascun file alla data rispetto a qualcosa di simile al seguente: 'per x in $ (some-command); fai echo $ x $ (git log -1 --format =% cd $ x); done'? – jonderry

+0

Non penso, dal momento che tutti i codici di formattazione '%' fanno riferimento a un * commit * piuttosto che a un singolo * file *. "echo" potrebbe essere il modo più semplice per arrivarci. –

+3

Vale la pena sottolineare che '% ci' restituisce le date formattate ISO (ish); così puoi ordinarli. Anche '% ai' restituisce la data dell'autore, anziché la data del commit. –

8

La risposta di Greg leggermente estendibile, git log può assumere più percorsi nel suo argomento. Mostrerà quindi solo i commit che includevano quei percorsi. Pertanto, per ottenere l'ultima impegnarsi, per un gruppo di file:

git log -1 --format=%cd -- fileA.txt fileB.txt fileC.txt 

Sono abbastanza spazzatura a scripting di shell, quindi non sono esattamente sicuro di come costruire quel comando tramite tubazioni, ma forse sarei un buon argomento per un'altra domanda.

+2

Sì, ma restituisce l'ultimo commit tra tutti i commit dei file, invece dell'ultimo commit * per ogni file *. – Cameron

+0

Questo funziona ma purtroppo non all'interno di un ambiente TravisCI. Quando TravisCI clona il repository, tutte le date del file sono la data e l'ora del clone (oggi/ora) e non la data e l'ora di ciò che è nel repository. Molto frustrante. – MitchellK

+0

Ho registrato un problema con TravisCI in merito a questo qui se qualcun altro è interessato> https://github.com/travis-ci/travis-ci/issues/8539 – MitchellK

1

Ecco un uno di linea usando find (spezzato in più per migliorare la leggibilità, ma grazie alle barre inverse di trascinamento, copia-incolla dovrebbe funzionare):

find <dirs...> -name '<pattern>' <any other predicate to get what you want> \ 
    -exec git log -1 --format="AAA%ai NNN" '{}' \; \ 
    -exec echo '{}' XXX \; \ 
| tr \\n N | sed -e 's/AAA/\n/g' | sed -e 's/NNNN/ /g' -e 's/XXX.*//g' 

La nuova linea eccessivamente complesso pressare con tr e sed è proprio lì per ottenere data e nome file su una riga e per ignorare i file non tracciati. Devi assicurarti che nessuno dei tuoi file contenga quegli stupidi indicatori AAA XXX NNNN.

Problemi correlati