2011-02-23 20 views
5

Estoy escribiendo un pequeño conjunto de pruebas que ejecuta la herramienta para ser probado en un montón de archivos de entrada. Para cada archivo de entrada, la herramienta está creando un archivo de salida correspondiente (ambos están en XML). Los archivos de entrada y salida se registran en un repositorio de Git.¿Cómo uso git diff -G?

Los archivos de salida llevan el tiempo cuando se compiló la herramienta, por lo que los archivos de salida seguramente se modifican después de que fueron re-creados por la herramienta que se está probando.

Para echar un vistazo rápido si la salida ha cambiado (cuando modifiqué las fuentes de la herramienta), me gustaría verificar si el contenido del nodo OutputFingerprint ha cambiado (hash simple sobre el contenido de las partes relevantes) del archivo de salida).

Leer el manual de git-diff, he encontrado que hay una opción -G:

-G < expresiones regulares >
buscar diferencias cuya añadido o eliminado la línea coincide con la expresión regular dada < >.

Lamentablemente, no proporcionan ningún ejemplo de cómo usar la opción -G.

Mi primer pensamiento fue simplemente escribir

git diff -GOutputFingerprint 

pero que está mal:

pensó
> git diff -GOutputFingerprint 
error: invalid option: -GOutputFingerprint 

siguiente fue poner la expresión regular entre barras, que también es no satisfactoria:

> git diff -G/OutputFingerprint/ 
error: invalid option: -GC:/Program Files/Git/OutputFingerprint/ 

Además, simplemente poniendo un espacio entre -G y OutputFingerprint no funciona:

> git diff -G OutputFingerprint 
fatal: ambiguous argument 'OutputFingerprint': unknown revision or path not in the working tree. 
Use '--' to separate paths from revisions 

Cuando llamo git diff sin params, consigo la modificación:

- <OutputFingerprint>e45807ca76fc5bb78e9e928c6fb7eed6</OutputFingerprint> 
+ <OutputFingerprint>d0846851bc9d52b37f7919def78660a2</OutputFingerprint> 

Otra idea era utilizar git diff -S".*OutputFingerprint.*" --pickaxe-regex, sino también que esto no tiene éxito.

git --version me da git version 1.7.3.1.msysgit.0 si es relevante.

Cuando pregunto git diff --help, el manual proporcionado me muestra la opción -G.

Entonces, ¿podría alguien darme un ejemplo de cómo usar git diff -G correctamente?

+0

trate de añadir un espacio entre el 'G 'y la expresión regular? – sarnold

+1

heh, mi git 1.7.1 no tiene la opción '-G' - ¿Me pregunto si el suyo tiene soporte' -G'? Es posible que necesite una versión más nueva para respaldar lo que desea hacer. – sarnold

+0

solo para asegurarse, ¿hay cambios reales para informar? Sin cambios no confirmados, obtuve tipos de errores de "revisión desconocida" incluso sin la '-G' ... Solo asegúrate de obtener algún tipo de diferencia antes de intentar filtrarla. – sarnold

Respuesta

5
git diff -Garegex 

funciona muy bien con msysgit 1.7.4, pero sólo en una sesión de bash (en una sesión de DOS, no devuelve nada)

Se mostrará el diff si la expresión coincide con una línea añade o eliminado de la versión provisional.
añadido o eliminado: no cambiado.
Significado en su caso, no funcionará

El PO eckes informes funciona (con msysgit1.7.4 + solamente), añadiendo que el diff man page para -G opción incluye:

"Busque las diferencias cuya agregó o línea eliminada coincide con la expresión regular dada",
que se relaciona con la salida diff donde se imprime una línea modificada como una línea agregada y una eliminada.


Ejemplo: añado una nueva línea de 'AAA' (sin git add: sólo una edición sencilla)

$ git diff -Gaaa 

diff --git a/conf/fragments/xxx_repos.conf b/conf/fragments/xxx_repos.coindex 263fa85..3475f9b 100644 
--- a/conf/fragments/xxx_repos.conf 
+++ b/conf/fragments/xxx_repos.conf 
@@ -10,3 +10,4 @@ repo xxx-sdsfwk 
    RW+        = vonc user1 user2 
    RW         = @xxx_users 
xxx-sdsfwk "Owner" = "for..." 
+aaa 
+0

@eckes: He actualizado mi respuesta con aclaraciones y un ejemplo. Para los cambios, cree un simple '' git diff | grep ... ''es suficiente;) – VonC

+0

Indicarme que msysgit 1.7.4 era el camino correcto! 'git diff -GOutputFingerprint' ahora me muestra que' OutputFingerprint' fue ** cambiado **. Exactamente lo que necesito ¡Gracias! – eckes

+0

@VonC: volver a 'grep' hubiera sido mi alternativa si no hubiera podido hacerlo solo con git means. Pero ahora, no hay necesidad de eso ... – eckes