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?

vfclists
la source

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'
CB Bailey
la source
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'
Bohumir Zamecnik
la source
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.'

sehe
la source
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
Tapis
la source
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 --
Hughdbrown
la source
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"
marjan.javid
la source
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`
Yonatan
la source
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.

Alan Whitelaw
la source
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.

MatrixManAtYrService
la source