El uso git gui blame
es difícil de hacer uso de secuencias de comandos, y al mismo tiempo 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 que hagan una lista de todos los cambios realizados en el cuerpo de su método.
Sin embargo, puede usar gitattributes
y la textconv
propiedad para armar una solución que haga precisamente eso. Aunque estas características originalmente estaban destinadas a ayudarle 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. Entonces git log
, git diff
etc. verá sólo el área que le interesa.
Aquí está el esquema de lo que hago en otro idioma; puede modificarlo según sus propias necesidades.
Escriba un breve script de shell (u otro programa) que tome un argumento, el nombre de un archivo fuente, y muestre solo la parte interesante de ese archivo (o nada si ninguno es interesante). Por ejemplo, puede utilizar sed
lo siguiente:
#!/bin/sh
sed -n -e '/^int my_func(/,/^}/ p' "$1"
Defina un textconv
filtro Git para su nuevo script. (Consulte la gitattributes
página de manual para obtener más detalles). El nombre del filtro y la ubicación del comando pueden ser los que desee.
$ git config diff.my_filter.textconv /path/to/my_script
Dile a Git que use ese filtro antes de calcular las diferencias para el archivo en cuestión.
$ echo "my_file diff=my_filter" >> .gitattributes
Ahora, si usa -G.
(tenga en cuenta .
) para enumerar todas las confirmaciones que producen cambios visibles cuando se aplica su filtro, tendrá exactamente las confirmaciones que le interesan. Cualquier otra opción que use las rutinas diff de Git, como --patch
, también obtenga esta vista restringida.
$ git log -G. --patch my_file
¡Voilà!
Una mejora útil que podría querer hacer es que su script de filtro tome un nombre de método como primer argumento (y el archivo como segundo). Esto le permite especificar un nuevo método de interés simplemente llamando git config
, en lugar de tener que editar su secuencia de comandos. Por ejemplo, podrías decir:
$ git config diff.my_filter.textconv "/path/to/my_command other_func"
Por supuesto, el script de filtro puede hacer lo que quiera, aceptar más argumentos o lo que sea: hay mucha flexibilidad más allá de lo que he mostrado aquí.