¿Cómo puedo usar Git para identificar cambios de funciones en diferentes revisiones de un repository?

Tengo un repository con un montón de files C. Dado el hash SHA de dos commits,

<commit-sha-1> y <commit-sha-2> ,

Me gustaría escribir un script (probablemente bash / ruby ​​/ python) que detecte qué funciones en los files C en el repository han cambiado en estos dos commits.

Actualmente estoy buscando la documentation para git log , git commit y git diff . Si alguien ha hecho algo similar anteriormente, ¿podría darme algunos consejos sobre dónde empezar o cómo proceder?

Eso no se ve muy bien, pero puedes combinar git con tu sistema de labeldo favorito, como GNU global para lograrlo. Por ejemplo:

 #!/usr/bin/env sh global -f main.c | awk '{print $NF}' | cut -d '(' -f1 | while read i do if [ $(git log -L:"$i":main.c HEAD^..HEAD | wc -l) -gt 0 ] then printf "%s() changed\n" "$i" else printf "%s() did not change\n" "$i" fi done 

Primero, necesita crear una database de funciones en su proyecto:

 $ gtags . 

A continuación, ejecute el script anterior para search funciones en main.c que se modificaron desde el último commit. La secuencia de commands podría, por supuesto, ser más flexible, por ejemplo, podría manejar todos los files *.c modificados entre 2 confirmaciones según lo informado por git diff --stats .

Dentro del script utilizamos la opción -L del git log de git log :

  -L <start>,<end>:<file>, -L :<funcname>:<file> Trace the evolution of the line range given by "<start>,<end>" (or the function name regex <funcname>) within the <file>. You may not give any pathspec limiters. This is currently limited to a walk starting from a single revision, ie, you may only give zero or one positive revision arguments. You can specify this option more than once. 

Ver esta pregunta

Guión Bash:

 #!/usr/bin/env bash git diff | \ grep -E '^(@@)' | \ grep '(' | \ sed 's/@@.*@@//' | \ sed 's/(.*//' | \ sed 's/\*//' | \ awk '{print $NF}' | \ uniq 

Explicación:

1: Obtener diff

2: Obtenga solo líneas con encabezados de trozos; si existe el 'encabezado de sección opcional' de un encabezado de trozo, será la definición de function de una function modificada

3: Elija solo encabezados trozos que contengan paréntesis abiertos, ya que contendrán definiciones de funciones

4: deshacerse de las secciones '@@ [old-file-range] [new-file-range] @@' en las líneas

5: deshacerse de todo después de abrir paréntesis

6: Deshacerse de '*' de los pointers

7: [Ver 'awk']: Imprime el último campo (es decir, columna) de los loggings (es decir, líneas).

8: deshacerse de nombres duplicates.