web-dev-qa-db-fra.com

Comment filtrer git diff en fonction des extensions de fichier?

Existe-t-il une option permettant de limiter git diff à un ensemble donné d'extensions de fichier?

113
vfclists

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

git diff -- '*.c' '*.h'
175
CB Bailey

Soit utilisez le globstar de votre shell (qui effectue une recherche récursive)1, 2:</ p>

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

ou utilisez find:

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

Les deux sont des noms spéciaux et une preuve d'espacement. Bien que vous souhaitiez peut-être filtrer les répertoires ayant l'extension .py :)


1 J'aime faire git diff -- {.,**}/*.py habituellement

2 </ sup> Lorsque globstar est activé, git diff -- **/*.py inclut déjà ./*.py. Dans la page de manuel de Bash: 'Si suivi de /, deux * adjacents ne correspondront qu'aux répertoires et sous-répertoires.'

8
sehe

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

git diff -- '***.py'
4
Bohumir Zamecnik

Argument de ligne de commande pour l'extension.

git diff *.py

Sinon, vous pouvez transférer find dans git diff:

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

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

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

Whitespace safe, et vous pouvez aussi avoir plusieurs extensions:

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

Je me suis retrouvé avec ceci:

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

Cela montre les différences pour le commit spécifié uniquement si le nom du fichier contient le mot 'test' (insensible à la casse) et ne se termine pas par .sql, modifiez le pipeline si nécessaire.

0

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

Quoi qu'il en soit, cela a fonctionné pour moi (dans mon exemple, rechercher un diff entre des fichiers python):

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

git diff ne montrera que les différences dans les fichiers non-staged.

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

0
Alan Whitelaw

Comme j'ai testé sur la version 2.18.0 de Git, nous devrions écrire l'extension de fichier entre guillemets doubles. Si vous voulez trouver les dernières différences entre le référentiel local et celui distant, après avoir extrait, vous pouvez l'écrire comme ci-dessous:

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

Par exemple:

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

0
marjan.javid