¿Cómo filtrar git diff en función de las extensiones de archivo?


152

¿Existe una opción para restringir git diffa un conjunto dado de extensiones de archivo?

Respuestas:


227

Sí, si se asegura de que git expanda un globo en lugar de su caparazón, coincidirá en cualquier nivel, por lo que algo como esto (las comillas son importantes) debería funcionar bien.

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

1
Ok, mi versión git era demasiado vieja. Funciona como se anuncia con 1.7.8. Excelente.
Mat

3
La mía trabajó con la expansión de la llave, a lagit diff -- *.{c,h,etc}
Matt Fletcher

9
el doble guión es importante, por ejemplo. git diff master HEAD -- "*filename.txt"también es útil elgit diff master HEAD --name-only
neaumusic

¡Las comillas simples ( '') también son importantes! git diff -- src/*.jsdebería sergit diff -- 'src/*.js'
Nickofthyme

1
También debe hacer esto en el directorio raíz del repositorio de git.
John Jiang

10

Para incluir archivos de forma recursiva (incluido el directorio actual) esto funcionó para mí:

git diff -- '***.py'

1
Para mí es la mejor solución. También puede excluir algunos archivos / directorios. Por ejemplo:git diff -- '***.py' ':!.Trashes'
Bartosz

¿Qué hacen los asteriscos triples (en comparación con un asterisco simple)?
Jann Poppinga

IIRC el doble asterisco significa (posiblemente) directorios anidados (incluso vacíos) y el asterisco único y .py significa el nombre del archivo. Por lo tanto, debería ser un archivo * .py en el directorio actual o anidado.
Bohumir Zamecnik

8

Utilice el globstar de su caparazón (que realiza una búsqueda recursiva) 1 , 2 :

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

o use find:

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

Ambos son nombres especiales y prueba de espacios en blanco. Aunque es posible que desee filtrar los directorios que tienen la extensión .py :)


1 me gusta hacer git diff -- {.,**}/*.pygeneralmente

2 Cuando globstar está habilitado, git diff -- **/*.pyya incluye ./*.py. En la página de manual de Bash: 'Si sigue a /, dos * s adyacentes coincidirán solo con directorios y subdirectorios'.


4

Para patrones de archivos simples, esto parece funcionar:

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

Whitespace safe, y también puede tener múltiples extensiones:

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

3

Argumento de línea de comando para extensión.

git diff *.py

Como alternativa, puede canalizar finda git diff:

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

por favor haga la respuesta un poco más legible. Podría haber sido suficiente con git diff *.pyy sin los títulos de gritos
sehe

1
Los 'encabezados de grito' fueron # -comentarios en un script de shell.
hughdbrown

Esta es la única solución que funcionó para mí, las comillas (etc.) no funcionaron en el símbolo del sistema de Windows.
Ed Bayiates

1

Como se probó en la versión 2.18.0 de git, la extensión del archivo debe ser entre comillas dobles. Si desea encontrar las últimas diferencias entre su repositorio local y el remoto, después de extraer, puede usar:

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

Por ejemplo:

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

1
Se trabajó para mí cuando he proporcionado - antes de la extensión, de esta manera,git diff master@{1} origin/master --name-only -- "*.cs"
333

0

Ninguna de las respuestas anteriores parece funcionar para mí git bashen Windows. No estoy seguro de si se trata de una versión (estoy usando 1.8.4) o de Windows / bash; Además, en mi caso, quería diferenciar dos ramas donde cada rama tenía archivos adicionales que no estaban presentes en la otra rama (por lo tanto, los basados ​​en "buscar" son negligentes).

De todos modos, esto funcionó para mí (en mi ejemplo, buscando una diferencia entre los archivos de Python):

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

Este stackoverflow.com/a/8554987/4233229 funciona, pero hay que usar comillas dobles en lugar de simples para Windows
lcnittl

0

git diff solo mostrará diferencias en archivos sin clasificar.

Encontré esta pregunta porque quería excluir .infoarchivos de git diff. Lo logré preparándolo git add *.info, lo que reduce los archivos que quedan.


0

Terminé con esto:

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

Esto muestra las diferencias para la confirmación especificada solo si el nombre de archivo contiene la palabra 'prueba' (no distingue entre mayúsculas y minúsculas) y no termina con .sql, modifique la canalización según sea necesario para su caso.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.