Se ha presentado la versión del sistema de control de versiones distribuido Git 2.56. El código de Git se distribuye bajo la licencia GPLv2+. En comparación con la versión anterior, se han adoptado 748 cambios en esta nueva versión, preparados por 104 desarrolladores, de los cuales 39 participaron en el desarrollo de Git por primera vez. Principales novedades (1, 2, 3):
- Se ha añadido el modo «git add —resolved» para resolver conflictos durante la fusión de ramas, que verifica los archivos en busca de marcas de conflicto y, al detectar al menos una marca en un archivo, devuelve un error, no indexa ninguno de los archivos y muestra una lista de archivos que requieren corrección. A diferencia del comando «git add —update», en el nuevo modo solo se procesan los archivos en conflicto, mientras que los archivos modificados no relacionados con conflictos son ignorados, lo que permite completar la fusión de ramas de manera segura, incluso si hay otros cambios no finalizados en el directorio de trabajo (el comando «git add —update» añadía al índice todos los archivos modificados previamente rastreados en el directorio de trabajo).
- Se ha acelerado significativamente el trabajo con grandes repositorios, gracias a la optimización del algoritmo de búsqueda de los últimos commits comunes durante la fusión de ramas y la comparación de commits. Ahora se tienen en cuenta los commits que pertenecen exclusivamente a una de las ramas, lo que permite detener el escaneo inmediatamente después de descubrir todos los posibles ancestros comunes, sin perder tiempo en seguir revisando el historial de cambios. En uno de los repositorios probados, la velocidad de búsqueda aumentó en promedio 20 veces, mientras que en otro, la aceleración alcanzó hasta 70 veces. Al ejecutar el comando «git merge-base —all v4.8 v4.9» en un repositorio del núcleo de Linux, el número de pasos de recorrido se redujo de 167,000 a 3,800.
- Se ha adaptado el modo de reempaquetado «—path-walk» para uso en servidores, permitiendo la creación de archivos pack más compactos mediante la agrupación de objetos por su ruta en el árbol de directorios (por ejemplo, para el repositorio de Fluent UI, el uso de «—path-walk» permitió reducir el tamaño del archivo pack de 558 MB a 164 MB). En esta nueva versión se ha implementado la posibilidad de utilizar el modo «—path-walk» junto con los mapas de bits de alcanzabilidad (reachability bitmap) y las islas de delta (delta island), empleadas por los servicios de hospedaje de Git para acelerar la operación y aislar los forks del repositorio principal.
- Se han eliminado cuellos de botella que provocaban cálculos excesivos en grandes repositorios: se han eliminado verificaciones innecesarias del estado de los archivos al escribir en el reftable; se ha eliminado el reexamen de la lista en cada inserción de un nuevo pack-file; se han acelerado las operaciones con el reftable que acumulaban muchas entradas de eliminación; se ha optimizado la funcionalidad de «git diff» al especificar restricciones en las rutas de los archivos. Después de las optimizaciones, el trabajo con el reftable en un gran número de eliminaciones se ha acelerado 65 veces (de 13 segundos a 0.2 segundos), y la ejecución del comando problemático «git diff» en el repositorio Chromium con 500,000 elementos en el índice ahora toma 0.07 segundos en lugar de 8 minutos.
- Se ha añadido la operación «git history drop» al equipo experimental «git history», que ofrece capacidades para reescribir el historial de cambios, para eliminar un commit seleccionado con la ayuda automática de sus descendientes al commit padre.
- Se ha añadido el comando «git branch —delete-merged ‘origin *’ ‘topic-*'» para eliminar de manera segura grupos de ramas locales cuyos cambios ya se han transferido a un repositorio externo. Se permite el uso de patrones para filtrar ramas y repositorios. Para analizar candidatos a eliminación, sin realizar realmente la operación, se puede usar la bandera «—dry-run».
- Se ha añadido el comando «git refs create|update|delete|rename», que combina operaciones de bajo nivel para crear, eliminar, renombrar y actualizar referencias.
- Se ha añadido la opción «—reset-when-found=[]» al comando «git bisect run», que devuelve automáticamente el repositorio al estado anterior al inicio de la búsqueda o mantiene activo el commit problemático, sin necesidad de ejecutar por separado el comando «git bisect reset».
- Se ha añadido la bandera «—linearize» al comando «git replay» para usar una topología de fusión plana, similar a «git rebase —no-rebase-merges», pero sin acceder al árbol de trabajo.
- Se ha implementado el seguimiento de cambios de nombre de archivos en un historial de cambios no lineal en el comando «git log —follow», por ejemplo, al fusionar subramas. La ruta del archivo ahora se almacena por separado para cada commit padre, lo que hace que el resultado sea independiente del orden de recorrido del historial de commits.
- Se ha agregado la posibilidad de utilizar el comando «git repack -a —filter=blob:limit=1m —drop-filtered» para eliminar blobs grandes que se han cargado bajo demanda desde un repositorio externo y que no se utilizan en el índice actual. Al acceder a estos objetos más adelante, se volverán a cargar automáticamente.
- En el comando «git log —graph» se ha implementado la adición de sangrías para separar visualmente los commits no relacionados en gráficos con múltiples raíces independientes.
- Se ha facilitado la detección de errores tipográficos comunes, como especificar «git push origin/main» en lugar de «git push origin main», o «git branch —set-upstream-to origin main» en lugar de «git branch —set-upstream-to=origin/main», y se muestra un aviso para utilizar la variante correcta.
Fuente: opennet.ru
