2010-11-04 12 views
11

Así que antes de ejecutar git commit a menudo a correr el siguiente:¿Cómo grep a través de sus archivos preparados antes de comprometerse?

git grep --cached -l -I "debugger" 

pensé que era similar a:

git diff --cached 

(que le mostrará todos los cambios que está a punto de cometer, es decir, . le mostrará la diferencia en sus archivos por etapas).

Desafortunadamente, acabo de encontrar que la opción --cached para git grep simplemente le dice a git que "solo" mire todo en su índice.

Entonces, ¿cómo puedo ejecutar git grep y tenerlo solo grep a través de mis archivos por etapas?

(Sí, sé que sólo podía hacer git diff --cached y la búsqueda de eso, pero yo preferiría tener la capacidad programática a grep a través de mis archivos por etapas.)

+0

Entonces, ¿logró resolver este problema? Me interesaría la respuesta. – ZeroOne

Respuesta

10

Una gran cantidad de pre-commit ganchos utilizan git diff-index --cached -S<pat> REV encontrar cambios que agregan o eliminan un patrón en particular. Entonces en tu caso, git diff-index --cached -Sdebugger HEAD. Es posible que desee agregar -u para obtener un diff, de lo contrario solo identifica el archivo ofensivo.

+4

La opción '-S' toma una cadena fija, no una expresión regular. (No estoy seguro de a qué se refería con "pat"). Sin embargo, git diffcore obtuvo recientemente la opción '-G ', que debería permitirle hacer cualquier cosa que estuviera tratando de hacer con 'git grep'. Todavía no está en una versión publicada, pero está en la rama principal 'git.git'. – Cascabel

+2

OK, esto me acerca a lo que necesito, pero no al 100%. Esto le dará una coincidencia positiva para su -S si fue agregado o eliminado. Solo quiero que se devuelva una coincidencia si * se agregó *. ¿Hay alguna forma de hacer eso? – steve

0

Primero necesita obtener una lista de archivos del índice (sin incluir los archivos eliminados). Esto se puede hacer con lo siguiente:

git diff --cached --name-only --diff-filter=d HEAD 

En segundo lugar es necesario utilizar el: prefijo para acceder a los contenidos de un archivo en el índice actual (por etapas, pero aún no comprometidos) ver gitrevisions manual para más información.

git show :<file> 

Finalmente aquí está un ejemplo de ponerlo todo junto a grep esta lista de archivos

# Get a list of files in the index excluding deleted files 
file_list=$(git diff --cached --name-only --diff-filter=d HEAD) 

# for each file we found grep it's contents for 'some pattern' 
for file in ${file_list}; do 
    git show :"${file}" | grep 'some pattern' 
done 

también here's an example de un git gancho pre-commit que utiliza este método para comprobar que los años de derechos de autor son de hasta hasta la fecha en los archivos que se comprometerán.

Cuestiones relacionadas