2009-11-17 15 views
5

¿Entiendo mal cómo funciona git grep --cached foo? La ejecución de las versiones de git 1.6.4.4 o 1.6.5.2, git grep --cached foo devuelve exactamente lo mismo que git grep foo.git grep --cached

Pensé que funcionaría como git diff --cached, buscando solo cambios en el área de ensayo. Eso es ciertamente lo que el man page me lleva a creer:

git diff [--options] --cached [<commit>] [--] [<path>…] 

Este formulario es para ver los cambios que por etapas para la próxima confirmación en relación con el llamado <commit>. Normalmente, desea comparar con la última confirmación, por lo que si no da <commit>, el valor predeterminado es HEAD. Si HEAD no existe (, por ejemplo,, ramas no nacidas) y <commit> no se muestra, muestra todos los cambios por etapas. --staged es un sinónimo de --cached.

¿Es esto solo un error, o hay una forma alternativa/mejor de encontrar cambios que se cometen que mencionan foo?

git diff --cached | grep foo 

El comando anterior me da la mitad de lo que quiero, pero pierde el contexto de qué archivo del cambio aparece en.

ACTUALIZACIÓN

Parece que tengo un error de concepto para lo que está mirando --cached. Parece que está buscando el estado del árbol suponiendo que se aplica el área de ensayo. Eso tiene sentido, ahora que lo pienso. Lo que quiero para buscar es la diferencia, no el árbol completo.

Específicamente, quiero saber la lista de todos los archivos (no me preocupan los números de línea o el contexto) en los que estoy a punto de cometer SpecialLog(...), así que puedo editar esos archivos y eliminar SpecialLog. Así que sí, puedo hacer git diff --cached y buscar en el localizador el SpecialLog, pero luego, para ver los grandes cambios en un solo archivo, hay muchos duplicados y no está claro qué archivo estoy viendo.

Respuesta

9
$ git init 
Initialized empty Git repository in /tmp/foo/.git/ 
$ echo hi there >file 
$ git add file 
$ git commit -m 'added file' 
[master (root-commit) dc08993] added file 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 file 
$ echo hi again >>file 
$ git grep again 
file:hi again 
$ git grep --cached again 
$ 

El tiempo pasa ...

$ git add file 
$ git grep --cached again 
file:hi again 

Para limitar el ámbito de la búsqueda al contenido de la próxima confirmación, git diff tuberías de su salida a $PAGER. Suponiendo que haya configurado su localizador en less, git diff --cached muestra las coincidencias de búsqueda en el contexto.

busque el índice para los archivos con los cambios que mencionan una serie especial, como en el siguiente ejemplo:

$ echo SpecialLog >file2 
$ git add file2 
$ git diff-index --cached --name-only HEAD 
file 
file2 
$ git diff-index --cached -SSpecialLog --name-only HEAD 
file2 
$ git diff --cached -SSpecialLog --name-only 
file2 
+0

Gracias. Me ayudaste a comprender mi error conceptual (mira la actualización en la descripción). Entonces, lo que realmente estoy buscando es algo que combine git diff y grep. El buscapersonas funciona, pero no es lo que estoy buscando;) –

+0

Ver la respuesta actualizada. –

+0

¡Dulce! ¡Eso es exactamente lo que quería! –