Comment filtrer git diff en fonction des extensions de fichiers?


152

Existe-t-il une option pour restreindre git diffà un ensemble donné d'extensions de fichiers?

Réponses:


227

Oui, si vous vous assurez que git développe un glob plutôt que votre shell alors il correspondra à n'importe quel niveau donc quelque chose comme ça (les guillemets sont importants) devrait fonctionner correctement.

git diff -- '*.c' '*.h'

1
Ok, ma version git était trop ancienne. Fonctionne comme annoncé avec 1.7.8. Excellent.
Mat

3
Le mien a travaillé avec l'expansion des accolades, à lagit diff -- *.{c,h,etc}
Matt Fletcher

9
le double tiret est important par exemple. git diff master HEAD -- "*filename.txt"aussi utile est legit diff master HEAD --name-only
neaumusic

Les guillemets simples ( '') sont également importants! git diff -- src/*.jsdevrait êtregit diff -- 'src/*.js'
Nickofthyme

1
Vous devez également le faire dans le répertoire racine du référentiel git.
John Jiang

10

Pour inclure des fichiers de manière récursive (y compris le répertoire actuel), cela a fonctionné pour moi:

git diff -- '***.py'

1
Pour moi, c'est la meilleure solution. Vous pouvez également exclure certains fichiers / répertoires. Par exemple:git diff -- '***.py' ':!.Trashes'
Bartosz

Que font les triples astérisques (par rapport à un seul astérisque)?
Jann Poppinga le

IIRC le double astérisque signifie (éventuellement) des répertoires imbriqués (même vides) et le simple astérisque et .py signifie le nom du fichier. Il devrait donc s'agir d'un fichier * .py dans le répertoire courant ou dans n'importe quel répertoire imbriqué.
Bohumir Zamecnik le

8

Soit utilisez la globstar de votre shell (qui effectue une recherche récursive) 1 , 2 :

shopt -s globstar 
git diff -- *.py **/*.py

ou utilisez find:

find -name '*.py' -print0 | xargs -0 git diff --

Ces deux éléments sont des noms spéciaux et des espaces protégés. Bien que vous souhaitiez peut-être filtrer les répertoires ayant l'extension .py :)


1 J'aime faire d' git diff -- {.,**}/*.pyhabitude

2 Lorsque globstar est activé, git diff -- **/*.pyinclut déjà ./*.py. Dans la page de manuel de Bash: 'Si suivi d'un /, deux * adjacents correspondront uniquement aux répertoires et sous-répertoires.'


4

Pour les modèles de fichiers simples, cela semble fonctionner:

$ git ls-files -zm '*.txt' | xargs --null git diff

Les espaces blancs sont sécurisés et vous pouvez également avoir plusieurs extensions:

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff

3

Argument de ligne de commande pour l'extension.

git diff *.py

Dans l'alternative, vous pouvez accéder findà git diff:

find . -name '*.py' -type f | git diff --

veuillez rendre la réponse un peu plus lisible. Vous auriez pu suffire avec git diff *.pyet sans les en- têtes en criant
sehe

1
Les 'en-têtes de cri' étaient des # -comments dans un script shell.
hughdbrown

C'est la seule solution qui a fonctionné pour moi, les guillemets (etc.) ne fonctionnaient pas sur l'invite de commande Windows.
Ed Bayiates

1

Comme testé sur git version 2.18.0, l'extension de fichier doit être entre guillemets. Si vous souhaitez trouver les dernières différences entre votre référentiel local et le référentiel distant, après l'extraction, vous pouvez utiliser:

git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"

Par exemple:

git diff master@{1} origin/master --name-only "*.cs"

1
Cela a fonctionné pour moi quand j'ai fourni - avant l'extension, comme ça,git diff master@{1} origin/master --name-only -- "*.cs"
333

0

Aucune des réponses ci-dessus ne semble fonctionner pour moi sous git bashWindows. Je ne sais pas si c'est une chose de version (j'utilise 1.8.4) ou une chose Windows / bash; aussi, dans mon cas, je voulais différencier deux branches où chaque branche avait des fichiers supplémentaires non présents dans l'autre branche (donc les fichiers basés sur «trouver» sont négligés).

Quoi qu'il en soit, cela a fonctionné pour moi (dans mon exemple, à la recherche d'un diff entre les fichiers python):

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`

Ce stackoverflow.com/a/8554987/4233229 fonctionne, mais il faut utiliser des guillemets doubles au lieu de simples pour Windows
lcnittl

0

git diff affichera uniquement les différences dans les fichiers non mis en scène.

J'ai trouvé cette question parce que je voulais exclure des .infofichiers de git diff. J'ai réalisé cela en le mettant en scène avec git add *.info, ce qui réduit les fichiers restants.


0

J'ai fini avec ceci:

commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --

Cela affiche les différences pour la validation spécifiée uniquement si le nom de fichier contient le mot «test» (insensible à la casse) et ne se termine pas par .sql, modifiez le pipeline si nécessaire pour votre cas.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.