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

En raison de la bureaucratie, je dois 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 courir pour obtenir cette liste?

Pour les fichiers modifiés entre un SHA donné et votre commit actuel:

git diff --name-only  HEAD 

ou si vous souhaitez inclure des fichiers modifiés mais pas encore validés:

 git diff --name-only  

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

 git diff --name-only   

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 suivis):

 git status 
  • Pour répertorier tous les fichiers modifiés non suivis en mode séquence :

     git diff --name-only 
  • Pour répertorier tous les fichiers modifiés suivis par étapes :

     git diff --name-only --staged 
  • Pour répertorier tous les fichiers modifiés suivis par étapes ou non :

     { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq 
  • Pour répertorier tous les fichiers non suivis (ceux répertoriés par git status , sans inclure aucun fichier ignoré):

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

Si vous utilisez ceci dans un script shell et que vous souhaitez vérifier par programme si ces commandes ont renvoyé quelque chose, vous serez intéressé par l’option --exit-code git diff .

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 répertorier tous les fichiers non-staged:

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

     while read filename; do echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename; done 
  • Pour les sortinger 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' 

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, du plus ancien au plus récent.

La liste des fichiers non modifiés peut être obtenue en utilisant git status et la commande grep comme ci-dessous. Quelque chose comme git status -s | grep M git status -s | grep M :

 root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M' M src/.../file1.js M src/.../file2.js M src/.../file3.js .... 

Avec git show vous pouvez obtenir un résultat similaire. Pour regarder le commit (comme il regarde sur git log vue du git log ) avec la liste des fichiers inclus dans, utilisez:

 git show --name-only [commit-id_A]^..[commit-id_B] 

[commit-id_A] est le commit initial et [commit-id_B] est le dernier commit que vous voulez montrer.

Attention particulière avec le symbole ^ . Si vous ne le mettez pas, les informations de commit-id_A ne seront pas déployées.

J’ai besoin d’une liste de fichiers ayant changé entre deux commits (seulement ajoutés ou modifiés), j’ai donc utilisé:

 git diff --name-only --diff-filter=AM   

Les différentes options de filtre de diff de la documentation de git diff :

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

Sélectionnez uniquement les fichiers ajoutés (A), Copiés (C), Supprimés (D), Modifiés (M), Renommés (R), leur type (fichier régulier, lien symbolique, sous-module,…) modifié (T), sont non fusionnés (U), sont inconnus (X) ou leur paire a été cassée (B). Toute combinaison des caractères de filtre (y compris aucun) peut être utilisée. Lorsque * (Tout ou rien) est ajouté à la combinaison, tous les chemins sont sélectionnés s’il existe un fichier correspondant à d’autres critères dans la comparaison. Si aucun fichier ne correspond à d’autres critères, rien n’est sélectionné.

En outre, ces majuscules peuvent être supprimées pour les exclure. Par exemple, –diff-filter = ad exclut les chemins ajoutés et supprimés.

Si vous souhaitez également répertorier le statut (par ex. A / M), remplacez --name-only par --name-status .

Si vous voulez vérifier les fichiers modifiés, vous devez vous occuper de nombreuses petites choses comme celle-ci, qui vous conviendra le mieux, comme si vous voulez vérifier lequel des fichiers a été modifié juste en tapant

statut git – il affichera les fichiers avec les modifications

alors si vous voulez savoir quels changements doivent être apportés, il peut être vérifié de manière,

git diff – affichera tous les changements dans tous les fichiers

ce n’est bon que lorsqu’un seul fichier est modifié

et si vous voulez vérifier un fichier particulier, utilisez

git diff