219 votes

Comment obtenir une liste de tous les fichiers qui ont été modifiés entre deux commits Git ?

En raison de la bureaucratie, j'ai besoin d'obtenir une liste de tous les fichiers modifiés dans mon référentiel pour un rapport (j'ai commencé avec le code source existant).

Que dois-je faire pour obtenir cette liste ?

63 votes

"à cause de la bureaucratie" xD

293voto

Amber Points 159296

Pour les fichiers modifiés entre une ZSD donnée et votre livraison actuelle :

git diff --name-only <starting SHA> HEAD

ou si vous voulez inclure les fichiers modifiés mais non encore validés :

git diff --name-only <starting SHA>

Plus généralement, la syntaxe suivante vous indiquera toujours quels fichiers ont été modifiés entre deux commits (spécifiés par leurs SHA ou autres noms) :

git diff --name-only <commit1> <commit2>

Utilisation de --name-status au lieu de --name-only montrera ce qui est arrivé aux fichiers ainsi que les noms.

3 votes

Et si vous voulez connaître les fichiers modifiés pour un commit particulier, faites-le : git diff --name-only <SHA> <SHA>^

74voto

Tim Bellis Points 396

Pour trouver les noms de tous les fichiers modifiés depuis votre dernier commit :

git diff --name-only

Ou (pour un peu plus d'informations, y compris les fichiers non tracés) :

git status

60voto

Flimm Points 8870
  • Pour énumérer tous les non mis en scène suivi des fichiers modifiés :

    git diff --name-only
  • Pour énumérer tous les mis en scène suivi des fichiers modifiés :

    git diff --name-only --staged
  • Pour énumérer tous les mis en scène et non mis en scène suivi des fichiers modifiés :

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
  • Pour énumérer tous les sans trace (ceux qui sont listés par git status (donc sans les fichiers ignorés) :

    git ls-files --other --exclude-standard

Si vous utilisez ceci dans un shell script, et que vous voulez vérifier de manière programmatique si ces commandes ont retourné quelque chose, vous serez intéressé par les éléments suivants git diff 's --exit-code option.

20voto

VonC Points 414372

Lorsque j'ai ajouté/modifié/supprimé de nombreux fichiers (depuis le dernier commit), j'aime regarder ces modifications dans l'ordre chronologique.

Pour cela, j'utilise :

  • Pour lister tous les fichiers non mis à jour :

    git ls-files --other --modified --exclude-standard
  • Pour obtenir la date de dernière modification de chaque fichier :

    while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done

Bien que ruvim suggère dans les commentaires :

xargs -0 stat -c '%y %n' -- 
  • Pour les trier du plus ancien au plus récent :

    sort

Un alias facilite son utilisation :

alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done|sort'

Ou (plus court et plus efficace, grâce à ruvim )

alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'

Par exemple :

username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd

Je peux maintenant revoir mes modifications, des plus anciennes aux plus récentes.

7voto

Fodder Points 429

J'ai besoin d'une liste de fichiers dont le contenu a été modifié entre deux commits (uniquement des ajouts, A ou modifié, M ), alors j'ai utilisé :

git diff --name-only --diff-filter=AM <from_commit_hash> <to_commit_hash>

Voici les différentes --diff-filter des options de l documentation git diff (voir aussi man git diff ) :

*`--diff-filter=[(A|C|D|M|R|T|U|X|B)…​[]]`**

Sélectionnez uniquement les fichiers qui sont ajoutés ( A ), copié ( C ), supprimé ( D ), modifié ( M ), Renommé ( R ), leur type (c'est-à-dire fichier ordinaire, lien symbolique, sous-module, ) est modifié ( T ), sont non fusionnés ( U ), sont inconnus ( X ), ou ont vu leur binôme brisé ( B ). Toute combinaison de caractères de filtrage (y compris aucun) peut être utilisée. Lorsque * (All-or-none) est ajouté à la combinaison, tous les chemins sont sélectionnés s'il y a un fichier qui correspond à d'autres critères dans la comparaison ; s'il n'y a aucun fichier qui correspond à d'autres critères, rien n'est sélectionné.

De plus, ces lettres majuscules peuvent être réduites pour être exclues. Par exemple --diff-filter=ad exclut les chemins ajoutés et supprimés.

Notez que tous les diffs ne peuvent pas présenter tous les types. Par exemple, les diffs de l'index à l'arbre de travail ne peuvent jamais avoir d'entrées ajoutées (parce que l'ensemble des chemins inclus dans le diff est limité par ce qui est dans l'index). De même, les entrées copiées et renommées ne peuvent pas apparaître si la détection de ces types est désactivée.

Si vous souhaitez également répertorier l'état (par exemple, l'état d'avancement des travaux), il est possible de le faire. A / M ), changer --name-only a --name-status :

git diff --name-status --diff-filter=AM <from_commit_hash> <to_commit_hash>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X