Come elencare tutti i file in un commit?


2794

Sto cercando un semplice gitcomando che fornisca un elenco ben formattato di tutti i file che facevano parte del commit dato da un hash (SHA1), senza informazioni estranee.

Ho provato:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

Sebbene elenca i file, include anche informazioni diff indesiderate per ciascuno.

Esiste un altro gitcomando che fornirà solo l'elenco che desidero, in modo da evitare di analizzarlo git showdall'output?


43
Sono venuto qui alla ricerca di qualcosa di diverso. Voglio vedere tutti i file modificati per una serie di commit e finiti git log --until 2013-05-21 --pretty="short" --name-onlycon un buon effetto.
Espiazione limitata il

4
Utilizzare questo comando per ottenere tutte le modifiche dai precedenti ncommit fino a master:git diff-tree --name-status -r @{3} master
ako

3
git diff --name-only master- Per elencare TUTTI i file modificati sul ramo corrente, confrontandoli con il ramo principale.
Noam Manos,

Risposte:


3764

Modo preferito (perché è un comando idraulico ; pensato per essere programmatico):

$ git diff-tree --no-commit-id --name-only -r bd61ad98
index.html
javascript/application.js
javascript/ie6.js

Another Way (meno preferito per gli script, perché è un comando di porcellana ; pensato per essere rivolto all'utente)

$ git show --pretty="" --name-only bd61ad98    
index.html
javascript/application.js
javascript/ie6.js

  • I --no-commit-idsopprime l'uscita impegnano ID.
  • L' --prettyargomento specifica una stringa di formato vuota per evitare la cruft all'inizio.
  • L' --name-onlyargomento mostra solo i nomi dei file interessati (grazie Hank). Usa --name-statusinvece, se vuoi vedere cosa è successo a ciascun file ( D eletto, M odificato, A sfumato)
  • L' -rargomento è ricorrere in sotto-alberi

25
Va notato che diff-treenon funzionerà quando si guarda il commit root.
jbranchaud,

327
Sostituendo l' --name-onlyopzione con si --name-statusotterrà un riepilogo più chiaro.
Kurt Zhong,

20
Se vuoi che funzioni sul commit root, usa il flag --root. Dalla pagina man: "Quando viene specificato --root, il commit iniziale verrà mostrato come un grande evento di creazione. Ciò equivale a un diff contro l'albero NULL."
Chris,

24
git log --name-only -n 1 <hash>L'ultimo commit sarebbe:git log --name-only -n 1 HEAD~1..HEAD
Kurt

10
Se qualcuno si chiede (come me lo sono stato) perché il primo modo è "preferito", si torna al commento di @drizzt; git showè "porcellana" (inteso per essere rivolto verso l'utente) ed git diff-treeè "idraulico" (inteso per essere utilizzato a livello di programmazione, ad esempio da script). L'interfaccia per la prima potrebbe cambiare nel tempo (quindi i manutentori di git potrebbero cadere --name-onlyanche se non immagino che lo farebbero ) per ragioni di usabilità, mentre l'interfaccia per la seconda sarà mantenuta il più stabile possibile per ragioni di compatibilità.
killscreen

237

Se vuoi ottenere un elenco di file modificati:

git diff-tree --no-commit-id --name-only -r <commit-ish>

Se si desidera ottenere un elenco di tutti i file in un commit, è possibile utilizzare

git ls-tree --name-only -r <commit-ish>

1
Ls-tree con --name-only non sembra funzionare su 1.6.4.4 o 1.6.3.3. Pensi che questo sia un bug?
krosenvold,

git ls-tree --name-only HEAD(il parametro <commit-ish> è obbligatorio ; in questo esempio è HEAD) funziona per me con la versione 1.6.4.3 di git
Jakub Narębski

2
Si scopre che l'ordinamento dei parametri è significativo qui. Quello nel tuo post non funziona, mentre quello nella vostra risposta fa il lavoro - almeno fino a quando si aggiorna il tuo post;)
krosenvold

5
Passa --no-commit-idper evitare di stampare SHA1, in questo modo:git diff-tree --no-commit-id --name-only -r <commit-ish>
John Mellor il

3
@CoDEmanX: Non ti sei perso l'aggiunta di -r/ -topzione, vero? Perché diff-tree gestisce sia i file modificati che quelli aggiunti. Se vuoi elencare tutti i nuovi file (aggiunti), usagit diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish>
Jakub Narębski il

226

Suppongo solo che gitknon è desiderato per questo. In tal caso, prova git show --name-only <sha>.


36
- solo il nome è abbondante nella maggior parte dei casi in cui ne avevo bisogno; Pertanto, ho valutato la soluzione più breve (e l'unica che ricorderei in 1 tentativo).
Erik S

25
Or --name-status.
Neil Traft

Come qualcuno a cui piace davvero CLI git, in gitkrealtà è un modo decente di rivedere i file e visualizzare il file su cui si trova il diff. ad es. il codice che rivede un commit dei mostri da un peer.
Elijah Lynn,

192

Personalmente uso la combinazione di --stat e --oneline con il comando show :

git show --stat --oneline HEAD
git show --stat --oneline b24f5fb
git show --stat --oneline HEAD^^..HEAD

Se non ti piacciono / vuoi le statistiche di addizione / rimozione, puoi sostituire --stat con --name-only

git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD

4
Questo è fantastico! Fondamentalmente ti dà il riepilogo del file che Github mostra nella parte superiore di una vista di commit. Grazie.
trisweb,

Molto bella. Per definire un alias:, alias gits='git show --stat --oneline'quindi gitsda solo mostra le ultime modifiche (in HEAD), mentre gits b24f5fbpuò essere usato per mostrare eventuali modifiche di revisione.
Brent Faust,

5
Si potrebbe anche creare un alias git ... ad esempio forse git config --global alias.changes 'show --stat --oneline'. Quindi puoi digitare git changes(con un commit-ish opzionale) e ottenere l'output dai primi esempi sopra.
scade il

Git per Windows richiede doppie virgolette:git config --global alias.changes "show --stat --oneline"
Alchemistmatt,

3
Bello. E a differenza della risposta accettata, git showfunziona anche per rivedere le modifiche nascoste: ad es.git show --stat --oneline stash@{1}
Jeff Ward,

83

Puoi anche fare

git log --name-only

e puoi sfogliare vari commit, messaggi di commit e file modificati.

Digita q per riavere il tuo prompt.


Grazie, aiuta A proposito: usare git show 5944ad2a8b5 --name-onlyper elencare il nome di un commit specifico
LiuWenbin_NO.

68

Di recente ho dovuto elencare tutti i file modificati tra due commit. Quindi ho usato questo comando (anche * nix specifico)

git show --pretty="format:" --name-only START_COMMIT..END_COMMIT | sort | uniq

Aggiornamento : O come Ethan sottolinea di seguito

git diff --name-only START_COMMIT..END_COMMIT

L'uso --name-statusincluderà anche la modifica (aggiunta, modificata, eliminata ecc.) Accanto a ciascun file

git diff --name-status START_COMMIT..END_COMMIT

4
Se lo usi git diff --name-status START_COMMIT..END_COMMIT, non hai bisogno del trascinamento |sort | uniq.
Ethan,

Correzione al commento sopra:git diff --name-only START_COMMIT..END_COMMIT
Ethan,

Questo è quello che stavo cercando. Come ho usato: git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'. Volevo un elenco di modifiche al codice solo per un enorme PR che aveva aggiunto migliaia di PNG e layout XML.
AutonomousApps,

63

La forma più semplice:

git show --stat (hash)

È più facile da ricordare e ti fornirà tutte le informazioni di cui hai bisogno.

Se vuoi davvero solo i nomi dei file, puoi aggiungere l' --name-onlyopzione.

git show --stat --name-only (hash)


2
--name-only includerà ancora un paio di righe di intestazione contenenti informazioni come l'autore, la data e il messaggio di commit.
divorò l'elisio il

solo uno ho scoperto che funziona per il merge commit
Alex Punnen,

47

Uso l' alias modificato abbastanza spesso. Per configurarlo:

git config --global alias.changed 'show --pretty="format:" --name-only'

poi:

git changed (lists files modified in last commit)   
git changed bAda55 (lists files modified in this commit)
git changed bAda55..ff0021 (lists files modified between those commits)

Comandi simili che potrebbero essere utili:

git log --name-status --oneline (very similar, but shows what actually happened M/C/D)
git show --name-only

40

Uso

git log --name-status

Questo ti mostrerà l'id di commit, il messaggio, i file modificati e se è stato modificato, creato, aggiunto o eliminato. Un po 'di un comando tutto in uno.


38

Usando il comando standard git diff (buono anche per gli script):

git diff --name-only <sha>^ <sha>

Se vuoi anche lo stato dei file modificati:

git diff --name-status <sha>^ <sha>

Funziona bene con gli commit di merge.


26

prova questo comando per nome e cambia il numero di riga

git show --stat <commit-hash>

mostra solo i nomi dei file

git show --stat --name-only  <commit-hash>

per ottenere l'ultimo hash di commit, quindi provare questo comando

git log -1

ultimo commit con mostra nome file e stato file modifica, crea o elimina

 git log -1 --oneline --name-status <commit-hash>

o per tutti

git log

per informazioni più avanzate sul registro git leggi questo articolo

https://devhints.io/git-log-format

https://devhints.io/git-log


1
@DanFare "fatale: argomento non riconosciuto: --names-only" da 2.20.1.windows.1
user2864740

24
$ git log 88ee8 ^ .. 88ee8 - only-only --pretty = "format:"

20

OK, ci sono un paio di modi per mostrare tutti i file in un particolare commit ...

Per ridurre le informazioni e mostrare solo i nomi dei file che hanno eseguito il commit, puoi semplicemente aggiungere --name-onlyo --name-statuscontrassegnare ..., questi flag mostrano semplicemente i nomi dei file che sono diversi dai precedenti commit come desideri ...

Quindi puoi fare git diffseguito da --name-only, con due hash di commit dopo <sha0> <sha1>, qualcosa come il seguente:

git diff --name-only 5f12f15 kag9f02 

Creo anche l'immagine seguente per mostrare tutti i passaggi da eseguire in queste situazioni:

git diff - solo nome 5f12f15 kag9f02


Perché due ref (li chiami hash)?
hakre,

15

Lo uso per ottenere un elenco di file modificati tra due changeset:

git diff --name-status <SHA1> <SHA2> | cut -f2

Sì, ma lo stato può essere abbastanza utile (per esempio, potresti voler grep per visualizzare tutti i file tranne quelli che sono stati eliminati con qualcosa del generegit diff --name-status .. | grep ^[^D] | cut -f2
Pierre-Adrien Buisson,


14

C'è anche git whatchanged, che è più basso livello digit log

NAME
       git-whatchanged - Show logs with difference each commit introduces

Emette il riepilogo del commit con un elenco di file sottostanti con le loro modalità e se aggiunto ( A), cancellato ( D) o modificato ( M);

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

Darebbe qualcosa del tipo:

commit f31a441398fb7834fde24c5b0c2974182a431363
Author: xx <xx@xx.nl>
Date:   Tue Sep 29 17:23:22 2015 +0200

    added fb skd and XLForm

:000000 100644 0000000... 90a20d7... A  Pods/Bolts/Bolts/Common/BFCancellationToken.h
:000000 100644 0000000... b5006d0... A  Pods/Bolts/Bolts/Common/BFCancellationToken.m
:000000 100644 0000000... 3e7b711... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h
:000000 100644 0000000... 9c8a7ae... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m
:000000 100644 0000000... bd6e7a1... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h
:000000 100644 0000000... 947f725... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m
:000000 100644 0000000... cf7dcdf... A  Pods/Bolts/Bolts/Common/BFDefines.h
:000000 100644 0000000... 02af9ba... A  Pods/Bolts/Bolts/Common/BFExecutor.h
:000000 100644 0000000... 292e27c... A  Pods/Bolts/Bolts/Common/BFExecutor.m
:000000 100644 0000000... 827071d... A  Pods/Bolts/Bolts/Common/BFTask.h
...

So che questa risposta in realtà non corrisponde "senza informazioni estranee", ma penso ancora che questo elenco sia più utile dei soli nomi di file.


Inoltre, basta un comando whatchangedinvece di fornire parametri.
Gabrielius

11

Mi piace questo:

git diff --name-status <SHA1> <SHA1>^

Penso che questo ottenga gli stati del file A& D(aggiungi ed elimina) all'indietro, perché mostra il diff dal commit specificato al commit precedente, invece che viceversa. Dovrebbe essere git diff --name-status <SHA1>^ <SHA1>.
Troy Gizzi,

11

Usa un semplice comando a una riga, se vuoi solo cambiare l'elenco dei file nell'ultimo commit:

git diff HEAD~1 --name-only

8

Elencare i file che sono stati modificati in un commit:

git diff --name-only SHA1^ SHA1

Ciò non mostra i messaggi di registro, le nuove righe extra o qualsiasi altro disordine. Questo funziona per qualsiasi commit, non solo per quello corrente. Non so il motivo per cui non è del tutto stato ancora citato, quindi sto aggiungerla.


Questi due sembrano uguali: git diff SHA1^ SHA1e git show SHA1.
Vladimir Vukanac,

1
@mrW Questi comandi producono un output simile, ma git showmostrano anche il messaggio di commit
Newtonx,

8

Visualizza il registro.

COMMIT può essere vuoto ("") o sha-1 o sha-1 abbreviato.

git log COMMIT -1 --name-only

Questo elencherà solo i file, molto utili per ulteriori elaborazioni.

git log COMMIT -1 --name-only --pretty=format:"" | grep "[^\s]"

8

Trovato una risposta perfetta a questo:

git show --name-status --oneline <commit-hash>

In modo che io possa sapere

which files were just modified M

Which files were newly added , A

Which files were deleted , D

5

Una combinazione di " git show --stat" (grazie Ryan) e un paio di comandi sed dovrebbero tagliare i dati per te:

git show --stat <SHA1> | sed -n "/ [\w]\*|/p" | sed "s/|.\*$//"

Questo produrrà solo l'elenco dei file modificati.


5

C'è un semplice trucco da visualizzare come elenco di file, basta aggiungere :dopo l'hash.

git show 9d3a52c474:

È quindi possibile eseguire il drill-in,

git show 9d3a52c474:someDir/someOtherDir

Se colpisci un file otterrai la versione grezza del file; che a volte è quello che vuoi se stai solo cercando un bel riferimento o parti chiave di codice (le differenze possono rendere tutto un casino),

git show 9d3a52c474:someDir/someOtherDir/somefile

L'unico inconveniente di questo metodo è che non mostra facilmente un albero di file.



2

Lo uso per ottenere l'elenco dei file modificati in commit unione

λ git log -m -1 --name-only --pretty="format:"
configs/anotherconfig.xml
configs/configsInRepo.xml

o

λ git log -m -1 --name-status --pretty="format:"
A       configs/anotherconfig.xml
M       configs/configsInRepo.xml

2

Se stai usando i plugin oh-my-zsh e git, il collegamento glg è utile.


3
Hai appena ... strappato tutto il codice dalla tua risposta? Questo non è affatto ciò a cui mi riferivo. Nessuna informazione estranea nell'output dei risultati come richiesto da OP, non nella tua risposta! Hai ancora una risposta che genera MOLTE informazioni estranee. Ma ora, è appena descritto molto meno accuratamente. OP voleva creare un elenco di file e nient'altro. Guarda quali glgrisultati: molto di più. Dispiace per la confusione.
RomainValeri,

0

Solo l'elenco dei file (nemmeno il messaggio di commit):

git show --name-only --pretty=format:

Ad esempio, apri tutti i file modificati nel tuo editor:

"$EDITOR" $(git show --name-only --pretty=format:)

-2

Ho pensato di condividere un riassunto del mio alias .. trovo anche che usare 'zsh' alla grande con git it chroma keys tutto bene e che ti dice che vuoi che il ramo sia sempre in funzione cambiando il prompt dei comandi.

Per quelli che coprono da SVN lo troverai utile: (questa è una combinazione di idee di diversi thread, mi prendo solo il merito di sapere come usare copia / incolla)

.gitconfig:
        ls = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative --name-status

>>git ls
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker| 
| A     icds.xcodeproj/project.pbxproj
| A     icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata
| A     icds/AppDelegate.m
| A     icds/Assets.xcassets/AppIcon.appiconset/Contents.json

* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker| 
| D     Classes/AppInfoViewControler.h
| D     Classes/AppInfoViewControler.m
| D     Classes/CurveInstrument.h


.gitconfig: 
       lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>>git lt
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker
* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker
* 778bda6 - Cleanup for new project (11 hours ago) Jim Zucker
* 7373b5e - clean up files from old version (11 hours ago) Jim Zucker
* 14a8d53 - (tag: 1.x, origin/swift, origin/master, master) Initial Commit (16 hours ago) Jim Zucker


.gitconfig
lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>> git lt

commit 99f21a61de832bad7b2bdb74066a08cac3d0bf3c
Author: Jim Zucker <jim@stratengllc.com>
Date:   Tue Dec 1 22:23:10 2015 -0800

    New Files from xcode 7

A       icds.xcodeproj/project.pbxproj
A       icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata


commit e0a1bb6b59ed6a4f9147e894d7f7fe00283fce8d
Author: Jim Zucker <jim@stratengllc.com>
Date:   Tue Dec 1 22:17:00 2015 -0800

    Move everything to old

D       Classes/AppInfoViewControler.h
D       Classes/AppInfoViewControler.m
D       Classes/CurveInstrument.h
D       Classes/CurveInstrument.m

-3

Questo dovrebbe funzionare:

git status

Questo mostrerà ciò che non è in scena e ciò che è in scena.


7
La domanda riguarda l'ottenimento dell'elenco dei file in un commit commesso in precedenza, ma non il commit che sta per essere eseguito.
Rup,
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.