¿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?

vfclists
fuente

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

sehe
fuente
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
Estera
fuente
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 --
hughdbrown
fuente
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"
marjan.javid
fuente
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`
Yonatan
fuente
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.

Alan Whitelaw
fuente
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.

MatrixManAtYrService
fuente