Muestra solo trozos relevantes de un parche / parche basado en una expresión regular

git log -G<regex> -p es una herramienta maravillosa para search en el historial de una base de código los cambios que coinciden con el patrón especificado. Sin embargo, puede ser abrumador localizar el trozo relevante en la salida de diff / patch en un mar de trozos casi irrelevantes.

Por supuesto, es posible search el resultado de git log para la cadena / expresión original, pero eso hace poco para networkingucir el ruido visual y la distracción de muchos cambios no relacionados.

Leyendo en el git log , veo que hay --pickaxe-all , que es exactamente lo contrario de lo que quiero: amplía la salida (a todo el set de cambios), mientras que yo quiero limitarlo (al hunk específico).

Básicamente, estoy buscando una forma de analizar "inteligentemente" el diff / patch en trozos individuales y luego ejecutar una búsqueda en contra de cada trozo (apuntando solo a las líneas modificadas), descartar los trozos que no coinciden y dar salida a los trozos. Esto hace.

¿Existe una herramienta como la que describo? ¿Hay un mejor enfoque para get los tíos emparejados / afectados?

Alguna investigación inicial que he hecho …

  • Si fuera posible grep la salida de diff / patch y hacer que los valores de las opciones de context sean dynamics, es decir, a través de expresiones regulares en lugar de conteos de líneas, eso podría ser suficiente. Pero grep no está exactamente construido de esa manera (ni estoy necesariamente solicitando esa característica).

  • Encontré la suite patchutils , que inicialmente sonaba como si se adaptara a mis necesidades. Pero después de leer sus páginas man , las herramientas no parecen manejar hunks coincidentes basados ​​en expresiones regulares. (Aunque pueden aceptar una list de tíos …)

  • Finalmente me encontré con splitpatch.rb , que parece manejar bien el análisis del parche, pero necesitaría ser aumentado significativamente para manejar los parches de lectura a través de stdin , haciendo coincidir los trozos deseados, y luego generando los trozos.

aquí https://stackoverflow.com/a/35434714/5305907 se describe una forma de hacer lo que está buscando. eficazmente:

git diff -U1 | grepdiff 'console' --output-matching=hunk

Muestra solo los trozos que coinciden con la cadena "console" dada.

No es exactamente lo que estás pidiendo, pero una forma de grep a través de hunks es el modo de agregar interactivo. Esto requiere que revises el compromiso después del parche en el que estás interesado

 git checkout COMMIT_ID 

luego regrese un paso más en el VCS, pero no en el directory de trabajo

 git reset --soft HEAD^ 

(En este punto, la diferencia entre el índice y el directory de trabajo corresponderá al parche que le interese).

Ahora puede ejecutar git add -p . Esto lanzará una session interactiva que tiene una opción / , que le permite localizar trozos en los que una línea coincide con una expresión regular. Particularmente útil si realmente desea procesar esos parches (por ejemplo, preparar una selección parcial).

Desafortunadamente, al less ahora el command / en add -p solo funciona en un único file, por lo que es posible que deba saltarse varios files irrelevantes.