online one files example commits branches git syntax diff

one - ¿De dónde viene el extracto en el encabezado de git diff hunk?



git diff one file (1)

Cuando uso git diff en un archivo C #, veo algo como esto:

diff --git a/foo.cs b/foo.cs index ff61664..dd8a3e3 100644 --- a/foo.cs +++ b/foo.cs @@ -15,6 +15,7 @@ static void Main(string[] args) string name = Console.ReadLine(); } Console.WriteLine("Hello {0}!", name); + Console.WriteLine("Goodbye"); } } }

La línea del encabezado del hunk contiene la primera línea del método actual ( static void Main(string[] args) ), lo cual es genial. Sin embargo, no parece ser muy confiable ... veo muchos casos en los que no funciona.

Así que me preguntaba, ¿de dónde viene este extracto? ¿ git diff reconoce de alguna manera la sintaxis del lenguaje? ¿Hay alguna forma de personalizarlo?


¿Hay alguna forma de personalizarlo?

La configuración se define en .gitattributes , sección "Definición de un encabezado de hunk personalizado" :

Primero, en .gitattributes , asignaría el atributo diff para las rutas.

*.tex diff=tex

Luego, definiría una configuración de " diff.tex.xfuncname " para especificar una expresión regular que coincida con la línea que desea que aparezca como el encabezado de hunk " TEXT ". Agregue una sección a su $GIT_DIR/config (o $HOME/.gitconfig ) de esta manera:

[diff "tex"] xfuncname = "^(////(sub)*section//{.*)$"

Nota. El analizador de archivos de configuración consume un solo nivel de barras invertidas, por lo que deberá duplicar las barras invertidas; el patrón de arriba selecciona una línea que comienza con una barra invertida, y cero o más apariciones de sub seguidas por una sección seguida de corchete abierto, hasta el final de la línea.

Hay algunos patrones incorporados para hacer esto más fácil, y tex es uno de ellos, por lo que no tiene que escribir lo anterior en su archivo de configuración (aún debe habilitarlo con el mecanismo de atributos, a través de .gitattributes ).

('' csharp '' es parte de los patrones incorporados actuales)

¿De dónde viene este extracto?
¿ git diff reconoce de alguna manera la sintaxis del lenguaje?

Inicialmente, el algoritmo era bastante tosco para la detección del nombre de la función:
Ver commit acb7257 (Git 1.3.0, abril de 2006, escrito por Mark Wooding)

xdiff : muestra nombres de funciones en encabezados de hunk.

La velocidad del generador de diferencial incorporado es agradable; pero los nombres de funciones mostrados por diff -p son realmente agradables. Y odio tener que elegir.
Entonces, xdiff para encontrar los nombres de funciones e imprimirlos.

Los nombres de las funciones son analizados por un algoritmo particularmente estúpido en este momento: solo intenta encontrar una línea en el archivo ''antiguo'', desde antes del inicio del fragmento, cuyo primer carácter parece plausible. Aún así, definitivamente es un comienzo.

Fue refinado con get_func_line() , proveniente de commit f258475 (Git 1.5.3, septiembre de 2007, escrito por Junio ​​C Hamano ( gitster ))

Puede ver en la confirmación la prueba t/t4018-diff-funcname.sh , para probar los patrones de nombre de función diff personalizados.

Selección de encabezado hunk basado en atributo por ruta.

Esto hace que los encabezados de hunk " diff -p " se gitattributes personalizar a través del mecanismo gitattributes .
Se basa en el parche anterior de Johannes que permitió definir una expresión regular única para ser utilizada para todo.

El mecanismo para llegar a la gitattributes que se utiliza para definir el encabezado del hunk es el mismo que para otros usos de gitattributes .
Usted asigna un atributo, funcname (porque " diff -p " generalmente usa el nombre de la función de la cual el parche es aproximadamente como el encabezado del hunk), un valor de cadena simple.
Este puede ser uno de los nombres de patrón incorporado (actualmente, se define java ") o un nombre de patrón personalizado, que se buscará en el archivo de configuración.

(in .gitattributes) *.java funcname=java *.perl funcname=perl (in .git/config) [funcname] java = ... # ugly and complicated regexp to override the built-in one. perl = ... # another ugly and complicated regexp to define a new one.

La sintaxis actual de xfuncname se introduce en commit 45d9414 , Git 1.6.0.3, octubre de 2008, creada por Brandon Casey

diff.*.xfuncname que usa diff.*.xfuncname "extendidas" para la selección del encabezado del hunk

Actualmente, los encabezados de hunk producidos por '' diff -p '' son personalizables configurando la opción diff.*.funcname en el archivo de configuración. La opción '' funcname '' toma una expresión regular básica. Esta funcionalidad se diseñó utilizando la biblioteca de expresiones regulares de GNU que, de forma predeterminada, permite usar versiones de barra diagonal inversa de algunos operadores de expresiones regulares extendidas, incluso en el modo de expresión regular básica. Por ejemplo, los siguientes caracteres, cuando están en barra diagonal inversa, se interpretan de acuerdo con las reglas de expresiones regulares extendidas ? , + , y | .
Como tal, los patrones de funcname incorporados se crearon utilizando algunos operadores de expresiones regulares extendidas.

Otras plataformas que se adhieren más estrictamente a las especificaciones POSIX no interpretan los operadores RE extendidos con barra diagonal inversa en el modo de Expresión Regular Básica. Esto hace que la coincidencia de patrones para los patrones de funcname incorporados falle en esas plataformas.

Introduzca una nueva opción '' xfuncname '' que usa expresiones regulares extendidas, y funcname en lugar de funcname .
Dado que la mayoría de los usuarios están en plataformas GNU, la mayoría de los patrones de funcname de funcname se crean y se prueban allí.
La publicidad solo xfuncname debería ayudar a evitar la creación de patrones no portátiles que funcionan con expresiones regulares GNU pero no en otros lugares.

Además, las expresiones regulares extendidas pueden ser menos feas y complicadas en comparación con las ER básicas, ya que muchos operadores especiales comunes no necesitan ser objeto de barra diagonal inversa.

Por ejemplo, el GNU Basic RE:

^[ ]*//(//(public//|static//).*//)$

se convierte en el siguiente RE extendido:

^[ ]*((public|static).*)$

Finalmente, se ha ampliado con el commit 14937c2 , para git 1.7.8 (diciembre de 2011), escrito por René Scharfe.

diff : agrega la opción para mostrar funciones completas como contexto

Agregue la opción -W / --function-context a git diff .
Es similar a la misma opción de git grep y expande el contexto de cambio de fuentes para que se muestre toda la función que lo rodea.
Este contexto "natural" puede permitir que los cambios se entiendan mejor.

Todavía se está modificando en Git 2.15 (Q4 2017)

El patrón incorporado para detectar el "encabezado de función" para HTML no coincide con los elementos <H1>..<H6> sin ningún atributo, que se ha corregido.

Antes de la versión 2.15, no se pudo hacer coincidir <h1>...</h1> , mientras que <h1 class="smth">...</h1> coincide.

Ver commit 9c03cac (23 de septiembre de 2017) por Ilya Kantor ( iliakan ) .
(Fusionada por gitster in commit 376a1da , 28 de septiembre de 2017)