167 votes

Filtrer git diff par type de changement

Existe-t-il un moyen de limiter git diff aux fichiers modifiés ?

J'aimerais voir les différences entre deux commits, mais exclure les chemins qui n'existent pas dans l'un ou l'autre (ajouts/suppressions). La ligne Perl suivante illustre l'essentiel de ce que je souhaite :

git diff master.. | perl -lnwe 'print unless /^(new|deleted) file/../^diff/ and not /^diff/'

Mais cela laisse diff --git a/path b/path pour les fichiers nouveaux ou supprimés. De plus, ce serait beaucoup plus agréable si je n'avais pas à analyser (cela échoue également si un morceau contient quelque chose qui correspond à /^diff/, par exemple).

J'ai également essayé une autre solution :

git diff --name-status (args) | perl -lnwe 'print if s/^M\s+//' | xargs git diff (args) --

Son rendement est meilleur, mais il semble toujours aussi artificiel.

304voto

zen Points 4033

Vous recherchez --diff-filter=M pour n'afficher que les fichiers M odifié entre les deux branches.

De man git-diff

--diff-filter=[ACDMRTUXB*]

Sélectionner uniquement les fichiers qui sont

  • A Ajouté
  • C Copié
  • D Supprimé
  • M Modifié
  • R Renommé
  • T changent de type (mode)
  • U Non fusionné
  • X Inconnu
  • B ont eu leur paire cassée
  • * Tout ou rien

Toute combinaison de caractères de filtrage peut être utilisée.

Quand * (Tout ou rien) est ajouté à la combinaison, tous les chemins sont sélectionnés s'il existe un fichier correspondant à d'autres critères de la combinaison Si aucun fichier ne correspond à d'autres critères, rien n'est sélectionné. n'est sélectionné.

En outre, ces lettres majuscules peuvent être mises en minuscules pour être exclues. Par exemple --diff-filter=ad exclut les chemins ajoutés et supprimés.

35voto

VonC Points 414372

Comme le rappelle Git 2.10 (Q3 2016), il existe un moyen plus simple de "tout afficher sauf les fichiers ajoutés/supprimés". (en fait depuis Git 1.8.5, juillet 2013)

 git diff --diff-filter=ad master..

Voir commit 16726cf (14 juillet 2016) par Junio C Hamano ( gitster ) .
(fusionné par Junio C Hamano -- gitster -- en commit 2f8c654 , 08 août 2016)

diff : document diff-filter l'exclusion

Dans les jours de la v1.8.5, 7f2ea5f ( diff : la lettre minuscule peut être utilisée pour spécifier quelle classe de changement exclure, 2013-07-17) a enseigné le " --diff-filter " mécanisme de prise en compte des lettres minuscules en tant qu'exclusion mais nous avons oublié de le documenter.

Donc la documentation sur diff-options comprend désormais (enfin) :

Ces lettres majuscules peuvent être diminuées pour être exclues.
Par exemple --diff-filter=ad exclut les chemins ajoutés et supprimés.

Veillez à utiliser Git 2.36 (T2 2022) .

7voto

iwg Points 134

Pour voir tous les fichiers modifiés et nouveaux, vous pouvez utiliser

git diff --name-only --diff-filter=ACMR PREV_VERSION master

PREV_VERSION est le hash de votre premier commit.

Pour obtenir une exportation au format zip, vous pouvez utiliser le code suivant

git archive --output=export.zip HEAD $(git diff --name-only --diff-filter=ACMR PREV_VERSION HEAD)

Remarque : .gitignore n'est pas dans export.zip

5voto

Kevin Ballard Points 88866

Vous pouvez utiliser l'option --diff-filter pour faire précisément cela. git diff --diff-filter=CMRTUXB master.. devrait tout afficher sauf les fichiers ajoutés/supprimés.

0voto

J'ai utilisé Notepad++ (Windows) et ces expressions régulières pour filtrer les types d'extension et certains chemins d'accès dans un fichier diff.

^Index.*\.(dll|pdb|exe|txt|zip|log|ism|resx|tlog|htm|lib)$[\s\S.]*?^Index
^Index: Shared/.+$[\s\S.]*?^Index
^Index: Next/source/Utility/.+$[\s\S.]*?^Index

Le seul problème, c'est qu'il arrive à la fin. Il faut faire 'ctrl+home' et recommencer jusqu'à ce qu'il ne trouve rien.

(Remplacer ce qui est trouvé par "Index")

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