Usando git gui blame
es difícil de hacer uso de secuencias de comandos, y mientras git log -G
y git log --pickaxe
cada uno puede mostrar que cuando la definición del método apareció o desapareció, no he encontrado ninguna manera de hacer la lista de todos cambios realizados en el cuerpo de su método.
Sin embargo, puede usar gitattributes
y la propiedad textconv
para armar una solución que hace precisamente eso. Aunque estas funciones fueron originalmente diseñadas para ayudarlo a trabajar con archivos binarios, funcionan igual de bien aquí.
La clave es hacer que Git elimine del archivo todas las líneas excepto las que le interesan antes de realizar cualquier operación de diferenciación. Luego, git log
, git diff
, etc. solo verá el área que le interese.
Aquí está el resumen de lo que hago en otro idioma; puedes ajustarlo para tus propias necesidades.
escribir un guión corto cáscara (u otro programa) que toma un argumento - el nombre de un archivo de origen - y salidas sólo la parte interesante de ese archivo (o nada si nada de esto es interesante) . Por ejemplo, es posible utilizar sed
de la siguiente manera:
#!/bin/sh
sed -n -e '/^int my_func(/,/^}/ p' "$1"
definir un filtro Git textconv
para su nuevo guión. (Consulte la página del manual gitattributes
para obtener más detalles.) El nombre del filtro y la ubicación del comando pueden ser lo que desee.
$ git config diff.my_filter.textconv /path/to/my_script
Dile Git para utilizar ese filtro antes de calcular diffs para el archivo en cuestión.
$ echo "my_file diff=my_filter" >> .gitattributes
Ahora, si se utiliza -G.
(nótese el .
) para enumerar todas las confirmaciones que producen cambios visibles cuando se aplica el filtro, tendrá exactamente esas confirmaciones que le interesan. Cualquier otra opción que usan rutinas diff de Git, como --patch
, también obtendrán esta vista restringida.
$ git log -G. --patch my_file
Voilà!
Una mejora útil es posible que desee hacer es tener la secuencia de comandos de filtro toma un nombre de método como primer argumento (y el archivo como su segundo). Esto le permite especificar un nuevo método de interés simplemente llamando al git config
, en lugar de tener que editar su secuencia de comandos. Por ejemplo, usted podría decir:
$ git config diff.my_filter.textconv "/path/to/my_command other_func"
Por supuesto, el guión de filtro puede hacer lo que quiera, tome más argumentos, o lo que sea: hay una gran cantidad de flexibilidad más allá de lo que he mostrado aquí.
He visto tal funcionalidad en la propuesta de Git GSoG. –
¿Es esta la propuesta de la que hablabas? http://lists-archives.org/git/715169-gsoc-draft-proposal-line-level-history-browser.html –
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) – lpapp