Está disponible la versión del sistema de control de versiones distribuido Git 2.31. Git es uno de los sistemas de control de versiones más populares, fiables y de alto rendimiento, que proporciona herramientas flexibles para el desarrollo no lineal, basadas en bifurcaciones y fusiones de ramas. Para garantizar la integridad del historial y la resistencia a los cambios "retroactivos", se utiliza un hashing implícito de todo el historial anterior en cada commit, y también es posible la verificación mediante firmas digitales por parte de los desarrolladores en etiquetas y commits individuales.
En comparación con la versión anterior, se han incorporado 679 cambios en la nueva versión, preparados con la participación de 85 desarrolladores, de los cuales 23 han participado por primera vez en el desarrollo. Las principales novedades son:
- Se ha añadido el comando "git maintenance", que permite realizar tareas periódicas en sistemas que no soportan cron. Por ejemplo, con el nuevo comando se puede organizar la ejecución periódica del proceso de empaquetado del repositorio, para no tener que esperar a que se complete el bloqueo del repositorio durante la ejecución automática del empaquetado al ejecutar diversos comandos. El comando "git maintenance" permite realizar optimizaciones y operaciones para mantener la estructura óptima del repositorio en segundo plano, sin bloquear la sesión interactiva: cada hora se ejecuta una tarea de carga anticipada de nuevos objetos desde el repositorio remoto y se actualiza el archivo con el grafo de commits, y cada noche se inicia el proceso de empaquetado del repositorio.
- Se ha añadido soporte para mantener un índice inverso en disco (revindex) para archivos de paquetes. Recordemos que Git almacena todos los datos en forma de objetos, que se colocan en archivos separados. Para aumentar la eficiencia del trabajo con el repositorio, los objetos se colocan adicionalmente en archivos de paquetes, en los que la información se presenta en forma de un flujo de objetos que siguen uno tras otro (un formato similar se utiliza al transferir objetos con los comandos git fetch y git push). Para cada archivo de paquete se crea un archivo de índice (.idx), que permite, dado el identificador del objeto, determinar rápidamente la posición en el archivo de paquete donde se almacena dicho objeto. El índice inverso propuesto en Git 2.31 (.rev) tiene como objetivo optimizar el proceso de determinación del identificador del objeto a partir de la información sobre la ubicación del objeto en el archivo de paquete.
Anteriormente, esta conversión se realizaba en tiempo real durante el análisis del archivo pack y solo se almacenaba en memoria, lo que impedía reutilizar dichos índices y forzaba a generar el índice cada vez. La operación de construcción del índice se reduce a crear un arreglo de pares "objeto-posicion" y ordenarlo por posición, lo que puede llevar mucho tiempo para archivos pack grandes.
Por ejemplo, la operación de salida del contenido de objetos que usa un índice directo se realizaba 62 veces más rápido que la operación de mostrar el tamaño de objetos, para la cual los datos de relación de posición con el objeto no estaban indexados. Después de usar un índice inverso, las operaciones mencionadas ahora tardan aproximadamente el mismo tiempo. Los índices inversos también permiten acelerar las operaciones de envío de objetos al ejecutar los comandos fetch y push gracias a la transmisión directa de datos ya preparados desde el disco. De forma predeterminada, no se crean índices inversos; se requiere habilitar la opción "git config pack.writeReverseIndex true" seguido de empaquetar el repositorio con el comando "git repack -Ad".
- Se han añadido optimizaciones de rendimiento, basadas en la incorporación del formato de archivo commit-graph, que se aplica para optimizar el acceso a la información sobre los commits, y nuevos datos sobre el número de generación del commit, que pueden utilizarse para acelerar operaciones adicionales con commits.
- Se han ampliado las capacidades para redefinir el nombre de la rama principal que se utiliza de forma predeterminada en nuevos repositorios (configuración init.defaultBranch). Al acceder a repositorios externos, git intenta extraer la rama a la que apunta HEAD, es decir, si el externo servidor usa por defecto la rama "main", entonces la operación "git clone" intentará extraer localmente "main". En Git 2.31, el soporte para dicha extracción ahora se implementa también para repositorios vacíos. Por ejemplo, al clonar localmente un nuevo repositorio antes de agregarle los primeros parches, la copia local ahora contendrá el nombre configurado en el externo servidor de la rama principal por defecto.
- Se ha añadido la opción "—disk-usage" al comando "git rev-list", que permite mostrar un resumen del tamaño de los objetos.
- En anticipación de la próxima sustitución del backend para realizar fusiones, se ha optimizado significativamente la detección de renombramientos.
- El soporte para la biblioteca de expresiones regulares obsoleta PCRE1 ha sido descontinuado.
- Se ha proporcionado la opción de desactivar forzosamente el uso de enlaces cortos, aplicándose independientemente del algoritmo de hash. La desactivación se activa asignando el valor «no» al parámetro core.abbrev.
- Se ha añadido la opción «—path-format=(absolute|relative)» al comando «git rev-parse» para especificar explícitamente la salida de rutas relativas o absolutas.
- Se ha simplificado la adición de reglas de autocompletado para los subcomandos «git» en scripts de autocompletado de Bash.
- Se ha añadido la opción «—stdin» al comando «git bundle» para leer referencias desde la entrada estándar.
- Se ha añadido una nueva opción «—diff-merges=» al comando «git log».
- Se ha añadido la opción «—deduplicatecan» al comando «git ls-files» para eliminar duplicados en la salida.
- Se han añadido nuevas máscaras para excluir rangos de confirmaciones: «^!» y «^-».
- Se han añadido las opciones «—left-only» y «—right-only» al comando «git range-diff» para mostrar solo un lado del rango comparado.
- Se han añadido las opciones «—skip-to=» y «—rotate-to=» a los comandos «git diff» y «git log» para omitir o mover al final las rutas iniciales.
- Se ha añadido la opción «—skip-to=» al comando «git difftool» para reanudar una sesión interrumpida desde una ruta arbitraria.
- El código de conducta, que define los principios básicos para resolver situaciones conflictivas entre desarrolladores, ha sido actualizado a la versión 2.0 (anteriormente se usaba la versión 1.4).
Fuente: opennet.ru
