Comment lister tous les fichiers dans un commit?
Je suis à la recherche d'une simple commande git
qui fournit une liste bien formatée de tous les fichiers qui faisaient partie de la validation donnée par un hash (SHA1), sans informations étrangères.
J'ai essayé:
git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d
Bien qu'il répertorie les fichiers, il inclut également des informations de diff indésirables pour chacun.
Y a-t-il une autre commande git
qui fournira juste la liste que je veux, afin que je puisse éviter de l'analyser à partir de la sortie git show
?
26 réponses
Manière Préférée (parce que c'est un plomberie commande; destiné à ê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 c'est une commande porcelain; 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-id
supprime la sortie de l'ID de validation. - l'argument
--pretty
spécifie une chaîne de format vide pour éviter le cruft au début. - l'argument
--name-only
affiche uniquement les noms de fichiers qui ont été affectés (Merci Hank). - l'argument
-r
est de recurser en sous-arbres
Si vous voulez 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 dans un commit, vous pouvez utiliser
git ls-tree --name-only -r <commit-ish>
Je vais simplement supposer que gitk
n'est pas désiré pour cela. Dans ce cas, essayez git show --name-only <sha>
.
Personnellement, j'utilise la combinaison de --stat et --oneline avec afficher commande:
git show --stat --oneline HEAD
git show --stat --oneline b24f5fb
git show --stat --oneline HEAD^^..HEAD
Si vous n'aimez pas/voulez l'ajout/suppression de stats, vous pouvez remplacer --stat avec --name-only
git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD
Vous pouvez également faire
git log --name-only
Et vous pouvez parcourir les différents commits, les messages de validation et les fichiers modifiés.
Tapez q pour récupérer votre invite.
Récemment, j'ai eu besoin de lister tous les fichiers modifiés entre deux commits. J'ai donc utilisé cette commande (aussi spécifique *nix)
git show --pretty="format:" --name-only START_COMMIT..END_COMMIT | sort | uniq
Mise à jour : ou comme Ethan le souligne ci-dessous
git diff --name-only START_COMMIT..END_COMMIT
L'utilisation de {[3] } inclura également la modification (ajoutée, modifiée, supprimée, etc.) à côté de chaque fichier
git diff --name-status START_COMMIT..END_COMMIT
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 voulez vraiment que les noms des fichiers vous pouvez ajouter la --name-only
option.
git show --stat --name-only (hash)
J'utilise changé alias 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
Utilisation de la commande git diff standard (aussi bonne pour les scripts):
git diff --name-only <sha>^ <sha>
Si vous souhaitez également le statut des fichiers modifiés:
git diff --name-status <sha>^ <sha>
Cela fonctionne bien avec les commits de fusion.
Utiliser
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 de tout en une seule commande.
OK, il y a plusieurs façons d'afficher tous les fichiers dans un commit...
Pour réduire les informations et afficher uniquement les noms des fichiers qui se sont engagés, vous pouvez simplement ajouter --name-only
ou --name-status
drapeau..., ces drapeaux vous montrent simplement les noms de fichiers qui sont différents des commits précédents comme vous le souhaitez...
Vous pouvez donc faire git diff
suivi 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 pour passer par dans ces situations:
Je l'utilise pour obtenir la liste des fichiers modifiés entre deux révisions:
git diff --name-status <SHA1> <SHA2> | cut -f2
Il y a aussi git whatchanged
, qui est plus bas que git log
NAME
git-whatchanged - Show logs with difference each commit introduces
Il affiche le résumé de 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 <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
...
Je sais que cette réponse ne correspond pas vraiment " sans informations étrangères.", mais je pense toujours que cette liste est plus utile que les noms de fichiers.
Utilisez une simple commande d'une ligne, si vous voulez juste que la liste des fichiers soit modifiée lors de la dernière validation:
git diff HEAD~1 --name-only
Liste les fichiers qui ont changé dans un commit:
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 juste l'actuel. Je ne sais pas pourquoi il n'a pas encore été mentionné tout à fait, alors je l'ajoute.
Affiche le journal.
La validation 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]"
Trouvé une réponse parfaite à ceci:
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
Une combinaison de " git show --stat
"(Merci Ryan) et 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.
Il y a une astuce simple à afficher comme une liste de fichiers, il suffit d'ajouter :
après le hachage.
git show 9d3a52c474:
Vous pouvez alors percer,
git show 9d3a52c474:someDir/someOtherDir
Si vous appuyez sur un fichier, vous obtiendrez la version brute du fichier; ce qui est parfois ce que vous voulez si vous cherchez seulement une bonne référence ou des morceaux de code clés (les diffs peuvent tout gâcher),
git show 9d3a52c474:someDir/someOtherDir/somefile
Le seul inconvénient de cette méthode est qu'elle ne montre pas facilement une arborescence de fichiers.
Je pensais partager un résumé de mon alias.. aussi, je trouve que l'utilisation de ' zsh ' est géniale avec git il 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 <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
Cela devrait fonctionner:
git status
Cela montrera ce qui n'est pas mis en scène et ce qui est mis en scène.