2011-03-03 7 views
8

Caso
A menudo me encuentro mirando un código viejo que no se ve bien. Parece que se ha eliminado algo (por ejemplo, tiene un bucle que no tiene ningún valor, o crea una variable pero no la usa), o algo es difícil de entender. En estos casos, realmente necesitaría ver el historial de esa sección del archivo. No todo el archivo, solo esa sección o función.Buscar compromisos de git relacionados con una determinada parte de un archivo

La solución ideal
Un comando simple como

git log books.cpp:10 

para encontrar la historia de la línea 10 (posiblemente con el entorno) de books.cpp archivo es probablemente demasiado mágica para pedir, pero ¿tiene ideas de cómo resolver esa historia?

Lo que he tratado
He intentado usar culpa, y luego la salida a la cometen antes del commit dado de esa línea - repitiendo hasta que he visto suficiente. Pero ese es un trabajo muy tedioso.

¿Ha sentido la necesidad de esta función? ¿Tienes una forma de lograrlo? ¡Comparte tu experiencia!

opción
+1

Parece que la culpa de git tiene poderosas opciones para ver la salida incremental y especificar rangos de archivo, ¿ha cavado en la página de manual? – CharlesB

+0

Ha modificado esta opción "git blame --incremental -n filename" –

Respuesta

4

Git es muy fácil de extender. ¿Algo como esto logra lo que quieres?

#!/bin/bash 

FILENAME=$1 
LINENUMBERS=$2 

for hash in `git log --pretty=format:%h ${FILENAME}` 
do 
    echo "***************** Showing ${FILENAME} at ${hash}" 
    git blame -L ${LINENUMBERS} ${hash} ${FILENAME} 
done 

poner este pequeño script en su camino como algo parecido a git-linehistory y lo llaman así:

git linehistory books.cpp 5,15 

le mostrará cuáles son las líneas 5 a 15 mirada como en cada comprometen para ese archivo.

2
  • git blame -L le permite especificar un rango de línea a la salida, o incluso una expresión regular para que coincida con la función que desee.
  • También puede culpar a un compromiso específico, entonces no tiene que verificar la revisión antes de la culpa.

En resumen, puede hacer llamadas sucesivas a git blame -L range <commit> <file-name> para explorar el historial de cambios de línea por línea.

Cuestiones relacionadas