2012-03-30 18 views
71

He mirado alrededor, y no estoy seguro de si esto es posible, pero aquí va:Git: Mostrar todos los diversos cambios de una sola línea en un archivo especificado en toda la historia de Git

tengo una (Javascript) archivo (por ejemplo /lib/client.js) en la que tengo un identificador único asignado a una variable, así: var identifier = "SOME_IDENTIFIER";

Se puede pensar en el identificador como un número de versión: periódicamente, nos cambie esta variable a un nuevo identificador.

Lo que me gustaría hacer es encontrar todos los identificadores únicos que hemos usado. ¿Cómo puedo hacer esto con git?

Imagino que podría haber una manera de buscar a través del historial de git e imprimir la línea que coincida con "var identifier =". Podría deducir esta lista manualmente.

De todos modos, agradecería cualquier información aquí. Gracias.

+2

posible duplicado de [Recuperar el registro de confirmación para una línea específica en un archivo?] (Http://stackoverflow.com/questions/8435343/retrieve-the-commit-log-for-a-specific-line-in -a-file) –

Respuesta

37

Consulte la página del manual para git-log y gitdiffcore. Creo que este comando lo haría, pero puede que no sea del todo bien:

git log -G "var identifier =" file.js 

EDIT: Aquí hay un comienzo difícil para un script bash para mostrar las líneas reales. Esto podría ser más de lo que estás buscando.

for c in $(git log -G "something" --format=%H -- file.js); do 
    git --no-pager grep -e "something" $c -- file.js 
done 

Se utiliza git log -G para encontrar las confirmaciones interesantes, usando --format=%H para producir una lista de cometer los hashes. Luego itera sobre cada compromiso interesante, pidiendo git grep para mostrar las líneas de esa confirmación y el archivo que contiene la expresión regular, precedida con el hash de confirmación.


EDIT: cambiado para usar en lugar de -G-S como se sugiere en los comentarios.

+0

@Rob - gracias por esto - pequeña edición de tu script - poniendo solo el nombre de archivo solo muestra confirmaciones que solo afectan ese archivo - si una confirmación hace referencia a otros archivos no está en la lista –

+0

@AdrianCornish - Me alegro de que fuera servicial. Creo que OP solo quería ver un archivo, pero está bastante seguro de que eliminar el nombre de archivo probablemente sea un script más útil en general. – rob

+0

Tengo una situación más difícil. El archivo en cuestión se movió de paht_a/file a path_b/file. Ahora cuando lo hago en path_b, solo muestra los cambios hasta cuando el archivo pasa de path_a a path_b. Si lo hago en path_a me dice fatal: argumento ambiguo 'file': revisión desconocida o ruta no en el árbol de trabajo. –

12

También puede hacer esto con gitk:

gitk file.js 

En el "comprometerse" desplegable, elegir la opción "añadir/quitar cadena:" y en el cuadro de texto junto a ella, introduzca "identificador var =" , y se confirmará cualquier compromiso que agregue o elimine líneas que contengan esa cadena.

+0

Esto ayudó a identificar la confirmación a la que se agregó la línea que contiene "var identifier =", pero no muestra las confirmaciones posteriores que modificaron esta línea. – findchris

+2

¿Has probado 'git blame file.js' o' git gui blame file.js'? –

+0

Sé lo que hace la culpa de git; Estoy buscando un historial completo de revisiones, ni una sola diferencia. – findchris

6

Si se adapta @ respuesta de robar un poco, git log básicamente lo hará por usted, si todo lo que necesita es una comparación visual:

git log -U0 -S "var identifier =" path/to/file 

-U0 medios de salida en el modo de parche (-p), y el espectáculo cero líneas de contexto alrededor del parche.

incluso se puede hacer esto a través de las ramas:

git log -U0 -S "var identifier =" branchname1 branchname2 -- path/to/file 

Puede haber una manera de suprimir el encabezado de diff, pero no sabe de uno.

+0

¡Trabajó para mí! Gracias. –

54

Desde git 1.8.4, hay una forma más directa de responder a su pregunta.

Suponiendo que la línea 110 es la línea que dice var identifier = "SOME_IDENTIFIER";, a continuación, hacer esto:

git log -L110,110:/lib/client.js 

Esto devolverá cada confirmación, que tocó esa línea de código.

[Git Documentation (ver el paramenter línea de comandos "L")]

2

En magit, se puede hacer esto con

l, =L 

A continuación, se puede pedir el archivo y empezar, líneas de fondo.

Cuestiones relacionadas