Comment lister tous les fichiers d'un commit?

2794

Je recherche une gitcommande simple qui fournit une liste bien formatée de tous les fichiers qui faisaient partie de la validation donnée par un hachage (SHA1), sans informations superflues.

J'ai essayé:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

Bien qu'il répertorie les fichiers, il inclut également des informations diff indésirables pour chacun.

Y a-t-il une autre gitcommande qui fournira juste la liste que je veux, afin que je puisse éviter de l'analyser à partir de la git showsortie?

Philip Fourie
la source
43
Je suis venu ici à la recherche de quelque chose d'un peu différent. Je veux voir tous les fichiers modifiés pour un ensemble de validations et finis git log --until 2013-05-21 --pretty="short" --name-onlyavec un bon effet.
Expiation limitée du
4
Utilisez cette commande pour obtenir toutes les modifications des nmastergit diff-tree --name-status -r @{3} master
ako
3
git diff --name-only master- Pour répertorier TOUS les fichiers modifiés sur la branche actuelle, en les comparant à la branche principale.
Noam Manos

Réponses:

3764

Manière préférée (parce que c'est une commande de plomberie ; censée être programmatique):

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

Une autre façon (moins préférée pour les scripts, car il s'agit d'une commande porcelaine ; destinée à être orientée vers l'utilisateur)

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

  • Le --no-commit-idsupprime la sortie de l'ID de validation.
  • L' --prettyargument spécifie une chaîne de format vide pour éviter la corruption au début.
  • L' --name-onlyargument affiche uniquement les noms de fichiers qui ont été affectés (Merci Hank). Utilisez --name-statusplutôt, si vous voulez voir ce qui est arrivé à chaque fichier ( D eleted, M odified, A dded)
  • L' -rargument est de rentrer dans des sous-arbres
Ryan McGeary
la source
25
Il convient de noter que diff-treecela ne fonctionnera pas lorsque vous regardez le commit racine.
jbranchaud
327
Remplacer l' --name-onlyoption par --name-statusdonnera un résumé plus clair.
Kurt Zhong
20
Si vous souhaitez qu'il fonctionne sur la validation racine, utilisez l'indicateur --root. À partir de la page de manuel: "Lorsque --root est spécifié, la validation initiale sera affichée comme un grand événement de création. Cela équivaut à un diff par rapport à l'arborescence NULL."
Chris
24
git log --name-only -n 1 <hash>Le dernier commit serait:git log --name-only -n 1 HEAD~1..HEAD
Kurt
10
Si quelqu'un se demande (comme moi) pourquoi la première voie est "préférée", cela revient au commentaire de @drizzt; git showest "porcelaine" (destiné à git diff-treeêtre utilisé par l' utilisateur) et "plomberie" (destiné à être utilisé par programme, par exemple à partir de scripts). L'interface pour le premier peut changer au fil du temps (de sorte que les responsables de git pourraient chuter --name-onlymême si je ne pense pas qu'ils le feraient ) pour des raisons d'utilisabilité, tandis que l'interface pour le second sera maintenue aussi stable que possible pour des raisons de compatibilité.
killscreen
237

Si vous souhaitez obtenir la liste des fichiers modifiés:

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

Si vous souhaitez obtenir la liste de tous les fichiers d'un commit, vous pouvez utiliser

git ls-tree --name-only -r <commit-ish>
Jakub Narębski
la source
1
L'arbre ls avec --name-only ne semble pas fonctionner sur 1.6.4.4 ou 1.6.3.3. Pensez-vous que c'est un bug?
krosenvold
git ls-tree --name-only HEAD(le paramètre <commit-ish> est requis ; dans cet exemple, il est HEAD) fonctionne pour moi avec la version 1.6.4.3 de git
Jakub Narębski
2
Il s'avère que l'ordre des paramètres est important ici. Celui de votre poste ne fonctionne pas, alors que celui de votre réponse ne travail - au moins jusqu'à ce que vous mettez à jour votre message;)
krosenvold
5
Passe --no-commit-idpour éviter d'imprimer le SHA1, comme ceci:git diff-tree --no-commit-id --name-only -r <commit-ish>
John Mellor
3
@CoDEmanX: Vous n'avez pas manqué d'ajouter -r/ -toption, n'est-ce pas? Parce que diff-tree gère les fichiers modifiés et ajoutés. Si vous souhaitez répertorier tous les nouveaux fichiers (ajoutés), utilisezgit diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish>
Jakub Narębski
226

Je suppose simplement que ce gitkn'est pas souhaité pour cela. Dans ce cas, essayez git show --name-only <sha>.

Hank Gay
la source
36
--name-only est suffisant dans la plupart des cas où j'en avais besoin; Par conséquent, a voté la solution la plus courte (et la seule dont je me souvienne en 1 essai).
Erik S
25
Ou --name-status.
Neil Traft
En tant que quelqu'un qui aime vraiment CLI git, gitkc'est en fait une manière décente de revoir les fichiers et d'afficher le fichier sur lequel se trouve le diff. Ex.: Code examinant un commit de monstre d'un pair.
Elijah Lynn
192

J'utilise personnellement la combinaison de --stat et --oneline avec la commande show :

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

Si vous n'aimez pas / ne voulez pas les statistiques d'ajout / suppression, vous pouvez remplacer --stat par --name-only

git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD
Tuxdude
la source
4
C'est bien! Il vous donne essentiellement le résumé du fichier que Github affiche en haut d'une vue de validation. Merci.
trisweb
Très agréable. Pour définir un alias:, alias gits='git show --stat --oneline'puis gitsen lui-même affiche les dernières modifications (dans HEAD), tandis que gits b24f5fbpeut être utilisé pour afficher les modifications de toute révision.
Brent Faust
5
On pourrait également créer un alias git ... par exemple peut-être git config --global alias.changes 'show --stat --oneline'. Ensuite, vous pouvez taper git changes(avec un commit-ish facultatif) et obtenir la sortie des premiers exemples ci-dessus.
lindes
Git pour Windows nécessite des guillemets doubles:git config --global alias.changes "show --stat --oneline"
Alchemistmatt
3
Agréable. Et contrairement à la réponse acceptée, git showfonctionne également pour examiner les changements cachés: par exemplegit show --stat --oneline stash@{1}
Jeff Ward
83

Vous pouvez aussi faire

git log --name-only

et vous pouvez parcourir les différents validations, les messages de validation et les fichiers modifiés.

Tapez q pour récupérer votre invite.

Indu Devanath
la source
Merci, ça aide. BTW: utilisez git show 5944ad2a8b5 --name-onlypour lister le nom d'un commit spécifique
LiuWenbin_NO.
68

Récemment, j'ai dû répertorier tous les fichiers modifiés entre deux validations. J'ai donc utilisé cette commande (également * spécifique à nix)

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

Mise à jour : ou comme le souligne Ethan ci-dessous

git diff --name-only START_COMMIT..END_COMMIT

L'utilisation --name-statusinclura également le changement (ajouté, modifié, supprimé, etc.) à côté de chaque fichier

git diff --name-status START_COMMIT..END_COMMIT
lunohodov
la source
4
Si vous utilisez, git diff --name-status START_COMMIT..END_COMMITvous n'avez pas besoin de la fin |sort | uniq.
Ethan
Correction du commentaire ci-dessus:git diff --name-only START_COMMIT..END_COMMIT
Ethan
C'est ce que je cherchais. Comment je l' ai utilisé: git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'. Je voulais une liste de changements de code uniquement pour un énorme PR qui avait ajouté des milliers de dispositions PNG et XML.
AutonomousApps
63

Forme la plus simple:

git show --stat (hash)

C'est plus facile à retenir et cela vous donnera toutes les informations dont vous avez besoin.

Si vous ne voulez vraiment que les noms des fichiers, vous pouvez ajouter l' --name-onlyoption.

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

VaTo
la source
2
--name-only inclura toujours quelques lignes d'en-tête contenant des informations telles que l'auteur, la date et le message de validation.
dévoré elysium
un seul que j'ai trouvé qui fonctionne pour le commit de fusion
Alex Punnen
47

J'utilise un alias modifié assez souvent. Pour le configurer:

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

puis:

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)

Commandes similaires qui peuvent être utiles:

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

Utilisation

git log --name-status

Cela vous montrera l'ID de validation, le message, les fichiers modifiés et s'il a été modifié, créé, ajouté ou supprimé. Un peu d'une commande tout-en-un.

alpha_989
la source
38

Utilisation de la commande standard git diff (également adaptée aux scripts):

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

Si vous souhaitez également l'état des fichiers modifiés:

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

Cela fonctionne bien avec les validations de fusion.

vquintans
la source
26

essayez cette commande pour le nom et change le numéro de ligne

git show --stat <commit-hash>

n'afficher que les noms de fichiers

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

pour obtenir le dernier hachage de validation, essayez cette commande

git log -1

dernière validation avec afficher le nom et l'état du fichier, modifier, créer ou supprimer

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

ou pour tous

git log

pour des informations plus avancées sur le journal git, lisez cet article

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

https://devhints.io/git-log

Jignesh Joisar
la source
1
@DanFare "fatal: argument non reconnu: --noms-only" de 2.20.1.windows.1
user2864740
24
$ git log 88ee8 ^ .. 88ee8 --name-only --pretty = "format:"
Pat Notz
la source
20

D'ACCORD, il existe plusieurs façons d'afficher tous les fichiers dans un commit particulier ...

Pour réduire les informations et afficher uniquement les noms des fichiers qui ont été validés, vous pouvez simplement ajouter --name-onlyou--name-status marquer ..., ces drapeaux vous montrent simplement les noms de fichiers qui sont différents des validations précédentes comme vous le souhaitez ...

Vous pouvez donc faire git diffsuivi de --name-only, avec deux hachages de validation après <sha0> <sha1>, quelque chose comme ci-dessous:

git diff --name-only 5f12f15 kag9f02 

Je crée également l'image ci-dessous pour montrer toutes les étapes à suivre dans ces situations:

git diff --nom uniquement 5f12f15 kag9f02

Alireza
la source
Pourquoi deux références (vous les nommez hachages)?
hakre
15

J'utilise ceci pour obtenir la liste des fichiers modifiés entre deux changesets:

git diff --name-status <SHA1> <SHA2> | cut -f2
user135507
la source
Oui, mais le statut peut être assez pratique (par exemple, vous voudrez peut-être afficher tous les fichiers sauf ceux qui ont été supprimés avec quelque chose commegit diff --name-status .. | grep ^[^D] | cut -f2
Pierre-Adrien Buisson
14

J'aime utiliser

git show --stat <SHA1>^..<SHA2>
Michael De Silva
la source
14

Il y a aussi git whatchanged, qui est un niveau plus bas quegit log

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

Il affiche le résumé de la validation avec une liste de fichiers en dessous avec leurs modes et s'il y a ajouté ( A), supprimé ( D) ou modifié ( M);

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

Donnerait quelque chose comme:

commit f31a441398fb7834fde24c5b0c2974182a431363
Author: xx <[email protected]>
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
...

Je sais que cette réponse ne correspond pas vraiment «sans aucune information étrangère», mais je pense toujours que cette liste est plus utile que les noms de fichiers.

Koen.
la source
De plus, une seule commande whatchangedau lieu de fournir des paramètres.
Gabrielius
11

J'aime ça:

git diff --name-status <SHA1> <SHA1>^
skiphoppy
la source
Je pense que cela obtient les statuts du fichier A& D(ajouter et supprimer) à l'envers, car il montre la différence entre la validation spécifiée et la validation précédente, au lieu de l'inverse. Ça devrait l'être git diff --name-status <SHA1>^ <SHA1>.
Troy Gizzi
11

Utilisez une simple commande d'une ligne, si vous voulez juste que la liste des fichiers soit modifiée lors du dernier commit:

git diff HEAD~1 --name-only
Developer-Sid
la source
8

Liste les fichiers modifiés dans une validation:

git diff --name-only SHA1^ SHA1

Cela n'affiche pas les messages de journal, les nouvelles lignes supplémentaires ou tout autre encombrement. Cela fonctionne pour n'importe quel commit, pas seulement celui en cours. Je ne sais pas pourquoi il n'a pas encore été mentionné, alors je l'ajoute.

Newtonx
la source
Ces deux se ressemblent: git diff SHA1^ SHA1et git show SHA1.
Vladimir Vukanac
1
@mrW Ces commandes produisent une sortie similaire, mais git showaffiche également le message de validation
Newtonx
8

Affichez le journal.

COMMIT peut être vide ("") ou le sha-1 ou le sha-1 raccourci.

git log COMMIT -1 --name-only

Cela listera uniquement les fichiers, très utiles pour un traitement ultérieur.

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

J'ai trouvé une réponse parfaite à cela:

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

Pour que je sache

which files were just modified M

Which files were newly added , A

Which files were deleted , D
Ijaz Ahmad Khan
la source
5

Une combinaison de " git show --stat" (merci Ryan) et de quelques commandes sed devrait réduire les données pour vous:

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

Cela ne produira que la liste des fichiers modifiés.

seanhodges
la source
5

Il existe une astuce simple à afficher en tant que liste de fichiers, ajoutez simplement :après le hachage.

git show 9d3a52c474:

Vous pouvez ensuite percer,

git show 9d3a52c474:someDir/someOtherDir

Si vous frappez un fichier, vous obtiendrez la version brute du fichier; qui est parfois ce que vous voulez si vous ne cherchez qu'une belle référence ou des morceaux de code clés (les différences peuvent tout gâcher),

git show 9d3a52c474:someDir/someOtherDir/somefile

Le seul inconvénient de cette méthode est qu'elle n'affiche pas facilement une arborescence de fichiers.

srcspider
la source
3
git show HEAD@{0}

fonctionne bien pour moi

Bruce
la source
2

J'utilise ceci pour obtenir la liste des fichiers modifiés dans le commit de fusion

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

ou

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

Si vous utilisez le plugin oh-my-zsh et git, le raccourci glg est utile.

Henri
la source
3
Vous venez de ... couper tout le code de votre réponse? Ce n'est pas du tout ce à quoi je faisais référence. Aucune information superflue dans la sortie des résultats comme demandé par OP, pas dans votre réponse! Vous avez toujours une réponse qui génère BEAUCOUP d'informations étrangères. Mais maintenant, c'est juste décrit beaucoup moins précisément. OP voulait sortir une liste de fichiers, et rien de plus. Regardez quelles glgsorties: beaucoup plus. Désolé pour la confusion.
RomainValeri
0

Seule la liste des fichiers (pas même le message de validation):

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

Par exemple, ouvrez tous les fichiers modifiés dans votre éditeur:

"$EDITOR" $(git show --name-only --pretty=format:)
user2394284
la source
-2

Je pensais que je partagerais un résumé de mon alias .. aussi je trouve l'utilisation de 'zsh' super avec git it chroma keys tout bien et dit que vous voulez que la branche soit en tout temps en changeant l'invite de commande.

Pour ceux qui couvrent de SVN, vous trouverez cela utile: (c'est une combinaison d'idées de différents threads, je ne prends que le crédit de savoir comment utiliser le copier / coller)

.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 <[email protected]>
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 <[email protected]>
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
Jim Zucker
la source
-3

Cela devrait fonctionner:

git status

Cela montrera ce qui n'est pas mis en scène et ce qui est mis en scène.

4067098
la source
7
La question consiste à obtenir la liste des fichiers dans une validation précédemment validée, et non la validation sur le point d'être validée.
Rup