Se ha publicado la versión 2.48 del sistema de control de versiones distribuido Git. Git se caracteriza por su alta performance y proporciona herramientas para el desarrollo no lineal, basadas en ramificaciones y fusiones de ramas. Para asegurar la integridad del historial y la resistencia a cambios retroactivos, se utiliza el hash implícito de toda la historia anterior en cada commit, así como la autenticación mediante firmas digitales de los desarrolladores para etiquetas y commits individuales. El código de Git se distribuye bajo la licencia GPLv2+.
En comparación con la versión anterior, en esta nueva versión se han incluido 605 cambios, realizados por 93 desarrolladores, de los cuales 35 participan por primera vez en el desarrollo. Principales novedades:
- Se ha implementado la posibilidad de compilar utilizando el sistema de construcción Meson, además de GNU Make y CMake. Ahora se puede usar el comando "meson setup build && ninja -C build" para compilar Git. Se observa que el Makefile, utilizado con GNU Make, ha crecido hasta 3887 líneas y no es tan simple como se desearía. La herramienta Meson facilita el trabajo con el sistema de construcción, es conveniente para compilaciones multiplataforma y hace que la construcción sea más accesible para principiantes o desarrolladores que no tienen experiencia con la herramienta Make. No se planea dejar de soportar Make y CMake en un futuro cercano.
- Se han añadido opciones de construcción que permiten utilizar implementaciones alternativas del hash SHA-1 al calcular las sumas de verificación que se utilizan para verificar la integridad de los bloques de datos en archivos pack. El rendimiento del cálculo de sumas de verificación es crucial; por ejemplo, aproximadamente el 78% del tiempo de CPU se gasta en el cálculo de sumas de verificación al clonar un repositorio del núcleo de Linux. La implementación predeterminada incluye verificaciones adicionales de colisiones y protección contra ataques a SHA-1, como SHAttered y Shambles. Esta protección, que consume recursos adicionales, solo tiene sentido al utilizar SHA-1 con fines criptográficos y es inútil para verificar la integridad de los datos indexados.
Para compilar Git con una implementación de SHA-1 más rápida, no apta para sistemas criptográficos, se ha propuesto una serie de opciones *_UNSAFE, como "OPENSSL_SHA1_UNSAFE". En GitHub, la compilación con SHA-1 simplificado permitió aumentar la performance de las operaciones de extracción y clonación de datos en un 10-13%.
- Se ha añadido la opción «—remerge-diff» en el comando «range-diff», que permite mostrar las diferencias entre el resultado total de la fusión y los datos reales reflejados en el commit después de ejecutar el comando «merge». Al usar la opción «—remerge-diff», las diferencias entre la resolución de conflictos no se dividen por cada rama padre, sino que se muestran las diferencias generales entre el archivo que tiene conflictos de fusión y el archivo en el que se han resuelto los conflictos. En el contexto del comando «range-diff», esta nueva opción puede ser útil para comparar conjuntos de commits después de trasladar la secuencia de commits mediante el comando «rebase» con la opción «—rebase-merges».
- Se ha añadido la posibilidad de ejecutar un conjunto de pruebas de Git con la activación del modo de detección de fugas de memoria. Dado que Git proporciona utilidades que cierran después de ejecutar la función llamada, las fugas de memoria no se consideraban un gran problema anteriormente. La necesidad de erradicar completamente las fugas de memoria se ha vuelto relevante tras el comienzo del trabajo para trasladar la funcionalidad interna a una biblioteca separada, que puede ser utilizada en procesos de larga duración.
- Se ha comenzado a elaborar una lista de modos y características obsoletas, cuyo soporte se planea eliminar en el futuro. Se espera que la eliminación de la funcionalidad obsoleta ocurra en la versión 3.0 de Git, que incluirá cambios que rompen la compatibilidad hacia atrás.
- Se ha continuado la optimización del comando «git for-each-ref», que imprime una lista de referencias en el repositorio. La optimización, que combina los manejadores para filtrar referencias y formatear la salida, ahora se aplica no solo a la salida no ordenada, sino también al especificar la opción «—sort».
- Se ha mejorado la implementación del backend «reftable» con almacenamiento en bloques para un almacenamiento eficiente de los enlaces a ramas y etiquetas en el repositorio. Reftable permite acelerar significativamente la búsqueda, lectura y escritura en repositorios con un número muy alto de enlaces. En la nueva versión, se ha dejado de hacer uso de algunas API auxiliares para excluir aún más la biblioteca libgit de las dependencias de compilación. Se ha implementado un manejo adaptativo de errores devueltos por las funciones de asignación de memoria (la falta de memoria ya no provoca un cierre inesperado). Se han acelerado las operaciones de creación de enlaces y se ha reducido el consumo de memoria.
- En la implementación de la clonación parcial se han resuelto problemas que causaban ciclos y corrupción del repositorio tras ejecutar el comando «git gc».
- Al ejecutar el comando «git fetch », si falta en el sistema local «refs/remotes//HEAD» pero existe en el otro lado una rama que referencia a HEAD, ahora «refs/remotes//HEAD» redirige a esta rama. Se ha añadido la configuración remote..followRemoteHEAD para gestionar la sincronización de «refs/remotes//HEAD» con el valor de HEAD en el otro lado de la conexión.
- Se ha añadido la configuración «remote..serverOption» similar a la opción de línea de comandos «—serverOption=».
- En el comando «git rebase —rebase-merges» se ha asegurado, siempre que sea posible, el uso de los nombres de las ramas como etiquetas.
- Se ha añadido la opción ‘-e’ a los comandos ‘git notes add’ y ‘git notes append’, que abre una nota en un editor de texto externo especificado a través de la variable de entorno GIT_EDITOR.
- Se ha mejorado la compatibilidad con GCC 15 y el estándar C23.
- Se ha dejado de dar soporte a versiones antiguas de libcURL y Perl.
Fuente: opennet.ru
