git diff filtrado por nombre de file

Me gustaría que los resultados de git diff se filtraran por el nombre del file.

En particular, quiero un diff para todos los files llamados "AssemblyInfo.cs", pero ubicado en cualquier lugar dentro del repository de git.

Estoy usando git en Cygwin, si eso hace la diferencia.

Los arguments del file para git diff deben estar delimitados por -- – testing esto:

 find . -name <pattern> | xargs git diff -- 

xargs se asegura de que los espacios, tabs, líneas nuevas, etc. se manejen correctamente.

Puede depurarlo con el argumento --name-status para git diff . También puedes probar:

 git diff --name-only | grep <pattern> 

[editar] Prueba:

 git diff --name-status -- `find . -name '<pattern>'` [email protected](98)$ git diff --name-status -- `find . -name '*.scm'` M scheme/base/boolean.scm M surf/compiler/common.scm M surf/compiler/compile.scm M surf/compiler/expand.scm 

El método más simple es simplemente usar un comodín:

 git diff -- *AssemblyInfo.cs 

Al less esto funciona en mi Git v1.8.4.

Puedes usar la tubería

 find . -name AssemblyInfo.cs | git diff 

Use find para filtrar todos los files llamados "AssemblyInfo.cs", luego use la salida como el parámetro de git diff .

Mientras que la respuesta dada por GoZoner funciona para algunos (cientos) files, ejecuta git diff varias veces (en el caso de xargs ) o falla (en el caso de git diff … -- `find …` ) si hay un gran cantidad de files a dif. Esto podría ser un problema o no, dependiendo de su caso de uso.

Una solución posible es crear una confirmación que contenga solo cambios en los files de interés y difiera las confirmaciones. Basándome en una respuesta sobre files sin clasificar que coinciden con algún patrón, se me ocurrió esta solución:

 git co <new_branch> --detach git reset --soft <old_branch> 

Ahora git status --porcelain | grep <pattern> git status --porcelain | grep <pattern> muestra todos los files que deben ser comparados. Todos los demás files se pueden enumerar pasando -v a grep , es decir, git status --porcelain | grep -v <pattern> git status --porcelain | grep -v <pattern> . Estos files deben restablecerse al estado de <old_branch> :

 # Remove the destination of renamed and copied files not matching <pattern> git status --porcelain | grep -v <pattern> | grep '^R \|^C ' | sed 's/.* -> //' | xargs git rm -f -- # Remove added files not matching <pattern> git status --porcelain | grep -v <pattern> | grep '^A ' | cut -c 4- | xargs git rm -f -- # Restore deleted files not matching <pattern> git status --porcelain | grep -v <pattern> | grep '^M \|^D ' | cut -c 4- | xargs git checkout HEAD -- 

(Tenga en count que usar xargs no es un problema en este caso, ya que llamar a git rm y git checkout varias veces está bien).

Ahora el índice (y la copy de trabajo) solo contienen cambios en los files que coinciden con <pattern> . El siguiente paso es comprometer estos cambios:

 git commit -m "Changes between <old_branch> and <new_branch> in files matching <pattern>" 

¡Eso es! Ahora podemos usar git diff como de costumbre:

 git diff HEAD^..HEAD 

Puede usar todas las opciones o arguments que desee.

Nota: Esta solución no se testing exhaustivamente y puede fallar, por ejemplo, en files con caracteres especiales u otros casos especiales … Las sugerencias para mejorar la solución son bienvenidas 😉

 find . -iregex AssemblyInfo\.cs -exec git diff {} + 

puede replace AssemblyInfo\.cs con su expresión regular.