Git delta codificación es copia/inserto basado.
Esto significa que el archivo derivado se codifica como una secuencia de códigos de operación que pueden representar copia instrucciones (por ejemplo: copia del archivo de base de Y bytes a partir de desplazamiento x en la memoria intermedia de destino) instrucciones de inserción o (por ejemplo: inserto los siguientes x bytes en el buffer de destino).
Como un ejemplo muy sencillo (tomado de la 'Soporte del sistema de archivos para Delta Compresión' papel), consideramos que queremos crear un buffer delta para transformar el texto "proxy de caché" en "caché de proxy ". Las instrucciones resultantes deben ser:
- Copia 5 bytes de 7 offset ('caché' copia de búfer base)
- Inserte dos espacios
- Copia 5 bytes desde la posición 0 ('Proxy' copia de la base búfer)
que se tradujo en la codificación de gIT se convierte en:
(1-3 bytes representan la primera instrucción)
- 0x91 (10010001), que se divide en
- 0x80 (10000000) (bit más significativo hace que este una 'copia desde la base hasta la salida' instrucción)
- 0x01 (00000001) (avance significa' un byte y usarlo como el offset base)
- 0x10 (00010000) (avance de un byte y usarlo como longitud)
- 0x07 (offset)
- 0x05 (longitud)
(bytes 4-6 representan la segunda instrucción)
- 0x02 (ya que el MSB no está establecido, esto significa 'insertar los siguientes dos bytes en la salida')
- 0x20 (espacio)
- 0x20 (espacio)
(7-8 bytes representan la última instrucción)
- 0x90 (10010000), que se divide en
- 0x80 (10000000) (significa 'copia')
- 0x10 (00010000) (avance de un byte y usarlo como longitud)
- 0x05 (longitud)
en cuenta que en la última instrucción de copia no especifica un desplazamiento que implica el desplazamiento 0. Otros bits de en el código de operación de copia también se puede establecer cuando/se necesitan grandes longitudes compensaciones.
búfer delta
El resultado tiene en este ejemplo tiene 8 bytes, que no es mucho de una compresión desde el buffer de destino tiene 12 bytes, pero cuando esto se aplica a la codificación de texto archivos de gran tamaño que puede hacer una gran diferencia.
He enviado recientemente un node.js library a github que implementa ambas funciones de diff/patch usando la codificación git delta. El code debería ser más legible y comentado que el que está en la fuente git, que está muy optimizado.
También he escrito unos cuantos tests que explican los códigos de operación de salida utilizados en cada ejemplo con un formato similar a la anterior.
El algo final podría ser uno personalizado, cuando leí un hilo 2011 como http: //git.661346.n2.nabble.com/diff-ing-files-td6446460.html – VonC
En 2008, aparentemente se utilizó libXDiff: http://git.661346.n2.nabble.com/libxdiff-and-patience- diff-td1452272.html – VonC
Ese hilo de 2011 es un buen enlace. Opción cita: "Así que, estrictamente hablando, el código actual en Git no tiene ningún parecido con el código libxdiff en absoluto. Sin embargo, el algoritmo básico detrás de ambas implementaciones es el mismo". – Thilo