Se ha presentado la versión 2.37 del sistema de gestión de texto distribuido Git. Git es uno de los sistemas de control de versiones más populares, confiables y de alto rendimiento, que ofrece herramientas flexibles para un desarrollo no lineal, basado en la ramificación y fusión de ramas. Para garantizar la integridad del historial y la resistencia a cambios retroactivos, se utiliza un hash implícito de todo el historial anterior en cada commit, y también es posible certificar con firmas digitales de los desarrolladores etiquetas y commits individuales.
En comparación con la versión anterior, esta nueva versión incluye 395 cambios, preparados con la participación de 75 desarrolladores, de los cuales 20 han participado en el desarrollo por primera vez. Las principales novedades son:
- Se ha preparado para su uso general el mecanismo de índices parciales (sparse index), que abarcan solo una parte del repositorio. Los índices parciales permiten mejorar el rendimiento y ahorrar espacio en repositorios donde se realizan operaciones de clonación parcial (sparse-checkout) o se trabaja con una copia incompleta del repositorio. En esta nueva versión, se ha completado la integración de índices parciales en los comandos 'git show', 'git sparse-checkout' y 'git stash'. La mejora de rendimiento más notable al usar índices parciales se observa en el comando 'git stash', cuya velocidad de ejecución ha aumentado en un 80% en algunas situaciones.
- Se ha implementado un nuevo mecanismo de "cruft packs" para empaquetar objetos inalcanzables (unreachable) a los que no se hace referencia en el repositorio (ninguna rama o etiqueta hace referencia a ellos). Los objetos inalcanzables son eliminados por el recolector de basura, pero permanecen en el repositorio durante un tiempo determinado para evitar condiciones de carrera. Para rastrear el periodo en el que los objetos inalcanzables permanecen, es necesario adjuntarles etiquetas con la hora de modificación de esos objetos, lo que impide almacenarlos en un único archivo pack, donde todos los objetos tienen un tiempo de modificación común. El almacenamiento previo de cada objeto en un archivo separado causaba problemas cuando había un gran número de objetos inalcanzables recientes que aún no podían ser eliminados. El mecanismo propuesto de "cruft packs" permite almacenar todos los objetos inalcanzables en un único archivo pack, mientras que los datos sobre el tiempo de modificación de cada objeto se reflejan en una tabla separada, que se guarda en un archivo con la extensión ".mtimes".
- Se ha implementado un mecanismo de seguimiento de cambios en el sistema de archivos integrado para Windows y macOS, lo que permite evitar el escaneo de todo el directorio de trabajo al realizar operaciones como "git status". Anteriormente, se podían conectar utilidades externas de seguimiento de cambios en el sistema de archivos a través de hooks para rastrear cambios, como Watchman, pero esto requería la instalación de programas adicionales y configuraciones. Ahora, esta funcionalidad está integrada y se puede habilitar con el comando "git config core.fsmonitor true".
- En el comando "git sparse-checkout" se ha declarado obsoleta la compatibilidad con el modo alternativo "—cone" del método de definición de patrones para la clonación parcial, que permitía enumerar archivos individuales con el uso de la sintaxis " .gitignore " al definir la parte del repositorio que caía bajo la operación de clonación, lo que no permite utilizar índices parciales para optimización.
- Se ha mejorado la flexibilidad de configuración de la llamada fsync() para volcar los cambios en el disco. Al parámetro «core.fsyncMethod» se ha agregado soporte para la estrategia de sincronización «batch», lo que permite acelerar la escritura de un gran número de archivos individuales al acumular cambios en el caché de escritura atrás, que se vuelca con una sola llamada a fsync(). La prueba realizada, en la que se añadieron 500 archivos con el comando «git add», se completó en 0.15 segundos con el nuevo modo habilitado, mientras que la llamada a fsync() para cada archivo tomó 1.88 segundos, y sin usar fsync, se completó en 0.06 segundos.
- Se ha añadido la opción «—since-as-filter=X» a comandos de navegación por ramas, como «git log» y «git rev-list», que permite filtrar la información sobre commits cuya fecha de creación es anterior a «X». A diferencia de la opción «—since», el nuevo comando se implementa en forma de filtro, sin detener el recorrido después del primer commit que es más antiguo que el tiempo especificado.
- En el comando «git remote» al usar la bandera «-v», se proporciona información sobre los clones parciales del repositorio.
- Se ha agregado la configuración «transfer.credentialsInUrl», que puede aceptar los valores «warn», «die» y «allow». Si se especifican credenciales en texto plano en el parámetro «remote.<name>.url», la ejecución de operaciones «fetch» o «push» se interrumpirá con un error si la configuración «transfer.credentialsInUrl» tiene el valor «die», o se emitirá una advertencia si está configurada como «warn».
- Por defecto, se utiliza una nueva implementación del modo interactivo del comando «git add -i», reescrita de Perl a C.
Fuente: opennet.ru
