Se presenta la versión del sistema de control de versiones distribuido Git 2.55. Entre los cambios clave se incluyen: la inclusión por defecto de la compilación con Rust, la implementación del proceso fsmonitor para Linux, una nueva estrategia de recompresión del índice MIDX incremental, el comando «git history fixup» para corregir commits, optimización de la generación de mapas de disponibilidad de objetos, soporte para la ejecución paralela de hooks, y el comando «git format-rev». El código de Git se distribuye bajo la licencia GPLv2+.
En comparación con la versión anterior, se han aceptado 505 cambios en esta nueva versión, preparados con la participación de 100 desarrolladores, 33 de los cuales han participado en el desarrollo de Git por primera vez. Las principales novedades (1, 2, 3):
- Por defecto, se ha habilitado el soporte para componentes en el lenguaje Rust. El compilador rustc
se ha añadido a las dependencias de compilación. Para compilar sin Rust, se puede usar la opción «NO_RUST=1» al ejecutar la utilidad make o «-Drust=disabled» al realizar «meson configure». La posibilidad de deshabilitar la compilación con Rust se mantendrá hasta la rama Git 3.0, en la cual Rust se incluirá como una dependencia obligatoria. Se ha implementado una capa en Rust para la portabilidad entre configuraciones con hash SHA-1 y SHA-256, así como algunas funciones internas, como la codificación y decodificación de valores enteros de longitud variable. En el futuro, se espera que más componentes internos significativos de Git sean reescritos en Rust. - Se ha añadido la operación «git history fixup» al equipo experimental «git history», que proporciona capacidades para reescribir la historia de cambios. La operación «fixup» permite trasladar cambios añadidos a través de «git add» a un commit anterior y reescribir automáticamente todos los commits posteriores de manera similar a la ejecución del comando «git commit —fixup=» y la ejecución de «git rebase —autosquash ~».
- Se ha implementado un proceso en segundo plano fsmonitor para la plataforma Linux que monitoriza cambios en el sistema de archivos utilizando el mecanismo inotify, lo que permite evitar escanear todo el directorio de trabajo al ejecutar comandos como «git status». La activación se realiza a través de la configuración «core.fsmonitor».
- Se ha añadido el modo «—write-midx=incremental» al comando «git repack», que implementa una nueva estrategia de actualización de metadatos en el índice MIDX incremental (multi-pack index), permitiendo evitar la recompresión de todo el índice. En el índice multifase incremental, en lugar de un único índice grande que contiene información sobre la distribución de objetos en los archivos de paquete, se aplica una división en capas: cada capa abarca un número específico de archivos de paquete y se almacena en un archivo bitmap separado. Esta estructura permite añadir datos sobre objetos en nuevos archivos de paquete al índice, adjuntando nuevas capas al índice sin reconstruir las capas ya existentes.
El comando «git repack —write-midx=incremental» permite agregar una nueva capa al índice MIDX incremental, cubriendo archivos de paquete recién creados. Combinado con el modo de empaquetado de repositorios «—geometric», el nuevo comando permite unir nuevos objetos de varios archivos de paquete en un solo archivo de paquete más grande y, si es necesario, empaquetar y fusionar varias capas adyacentes del índice MIDX incremental. Esta estrategia permite, al ejecutar «git repack», reescribir solo las capas superiores, dejando intactas las antiguas capas grandes y evitando el crecimiento descontrolado de la cadena de capas, manteniendo el número total de capas a un nivel proporcional al logaritmo del número total de objetos.
- Se ha optimizado significativamente la generación de mapas de disponibilidad de objetos gracias a un nuevo algoritmo de recorrido del árbol de objetos que elimina la recursión innecesaria, el almacenamiento en caché de posiciones de objetos, la clasificación de mapas antes de su combinación mediante la operación XOR y la reestructuración del código para la creación de mapas de pseudo-fusión (pseudo-merge). En el repositorio de prueba, las optimizaciones han reducido el tiempo de generación de mapas de 612 a 294 segundos.
- Se ha implementado la posibilidad de ejecutar en paralelo hooks independientes en los archivos de configuración. No se pueden ejecutar en paralelo los hooks que afectan al estado compartido o que lo tienen en cuenta, como aquellos que cambian los mensajes de los commits o inspeccionan los índices y el árbol de trabajo. Sin embargo, es posible ejecutar en paralelo los hooks para la verificación con linters y la ejecución de pruebas unitarias. Los hooks que permiten la ejecución paralela se configuran mediante el parámetro «hook.nombre_del_hook.parallel = true». El número de trabajos que se ejecutan simultáneamente se determina a través de la configuración hook.jobs, hook..jobs o la opción de línea de comando «-j».
- En el comando «git pack-objects —path-walk» se ha implementado la opción de especificar filtros como «blob:none», «blob:limit=», «tree:0», «object:type=», «sparse:» y «combine:». En la prueba realizada, descartar blobs durante la ejecución de «—path-walk» permitió reducir en un 16% el tamaño del pack-file generado.
- Se ha añadido el comando «git format-rev» para formatear revisiones y nombres de objetos mencionados en listas de commits o que aparecen en texto arbitrario (por ejemplo, se puede usar en hooks para procesar mensajes de commits).
git last-modified | git format-rev —stdin-mode=text —format=%an
Junio C Hamano builtin/commit.c
- Se ha habilitado por defecto el escape de la mayoría de las secuencias de control de terminal en los mensajes informativos y en el texto de errores transmitidos. el servidorAl acceder a los maliciosos servidor tales secuencias de escape podrían usarse para ocultar o modificar la salida, por ejemplo, mediante secuencias de escape para mover el cursor y limpiar el texto. Se mantiene soporte para secuencias de escape para resaltar elementos en color.
- El comando «git checkout -m» ahora guarda automáticamente los cambios locales en conflicto en el área de stash sin necesidad de resolver el conflicto inmediatamente.
- En el comando «git push» se ha añadido la posibilidad de enviar una rama a varios servidores Git externos con un solo comando. Por ejemplo, para enviar la rama main no solo al servidor principal, sino también a los espejos, se puede crear un grupo «publish» de servidores «github», «gitlab» y «mirror»:
git config remotes.publish «github gitlab mirror»
git push publish main - En el comando «git log —graph» se ha añadido la opción «—graph-lane-limit=» para limitar el número de bandas verticales al visualizar ramas, lo que permite dejar espacio en la pantalla para datos sobre commits en repositorios con un gran número de ramas.
…
* | | | | 619931f561 Fusionar la rama ‘dl/posix-unused-warning-clang’
|\ \ \ \ \
| * | | | ~ cf48887610 compat/posix.h: simplificar la comparación GIT_GNUC_PREREQ()
| * | | | ~ ffd45926dc compat/posix.h: limpiar GIT_GNUC_PREREQ() y UNUSED
|\ \ \ \ \~
| * | | | ~ 3f5203eeb4 ls-files: filtrar pathspec antes de lstat - Se añadió la opción «—max-count-oldest=» a los comandos «git log» y «git rev-list», que permite seleccionar los N commits más antiguos en el rango.
Fuente: opennet.ru
