Introducción
Los equipos que usan jj como alternativa a Git o en entornos híbridos pueden encontrar problemas al sincronizar tags con remotos, manejar salidas de comandos en scripts o enfrentarse a fallas inesperadas por race conditions. La release v0.44.0 aborda estos puntos con cambios en el comportamiento por defecto de jj git fetch, mejoras en jj run y fixes para bugs que podían corromper el repositorio o provocar panics.
Qué ocurrió
El 24 de mayo de 2024, el proyecto jj lanzó la versión v0.44.0, con modificaciones significativas en la interoperabilidad con Git, la gestión de tags y la ejecución de comandos. Los cambios más relevantes para equipos de infraestructura incluyen:
- Sincronización de tags:
jj git fetchahora recupera tags de forma similar a los bookmarks (branches), trackeando automáticamente las tags locales con sus homónimas en el remote. - Comportamiento de
jj run: Ahora procesa revisiones de oldest a newest por defecto, garantizando el orden de ejecución incluso con--jobs > 1. - Nuevos flags:
jj runsuma--passthrough,--ignore-changesy--ignore-errorspara mayor control sobre la ejecución de comandos. - Fixes críticos: Se corrigieron panics en
jj runcon commits con conflicts, fallas al leer configuración en repositorios copiados y un race condition enjj git import/exporten workspaces colocados.
Impacto para DevOps / Infraestructura / Cloud / Seguridad
Para equipos de DevOps, el cambio más disruptivo es la nueva semántica de tags en jj git fetch. En versiones anteriores, los tags no se sincronizaban automáticamente, lo que podía generar discrepancias entre el repositorio local y el remote. Ahora, las tags se recuperan por defecto y se trackean localmente (ej: v1.0@origin), lo que simplifica la gestión de releases pero puede aumentar el tráfico de red en repositorios con muchos tags. En entornos con CI/CD, esto podría impactar el tiempo de los pipelines que ejecutan jj git fetch.
En infraestructura, las mejoras en jj run son clave para scripts de deployment o maintenance. El orden garantizado de ejecución (oldest a newest) evita problemas de dependencias entre revisiones, y los nuevos flags (--ignore-errors, --passthrough) permiten diseñar workflows más robustos. Por ejemplo, un script que aplique migraciones de base de datos puede usar --ignore-errors para continuar ante fallos no críticos.
En seguridad, el fix del race condition en jj git import/export (issue #9833) elimina un vector potencial de corrupción de datos en workspaces compartidos. Aunque jj no es tan widely deployed como Git, su uso en entornos con repositorios críticos justifica atención a este tipo de bugs.
Detalles técnicos
Cambios en sincronización con Git
jj git fetch: Ahora recupera tags y las trackea automáticamente. Las tags remotas se representan como<name>@<remote>(ej:v1.0@origin). Para deshabilitar esto, configurar en~/.jjconfig:
[remotes."origin"]
fetch-tags = "~*"
jj git clone: El flag--fetch-tagsfue removido. En su lugar, usar--tag=PATTERN(ej:--tag="v*").jj git push --all: Ahora pushia tags además de bookmarks.
Mejoras en templates y revsets
WorkspaceRef.root()yRepoPath.absolute(): Ahora retornanOption<FsPath>yFsPath(noString). Los templates deben adaptarse:
# Antes (v0.43.0)
{{ workspace.root() }}
# Ahora (v0.44.0)
{{ workspace.root().to_str() }}
- Nuevo revset:
merge_point(revs...)encuentra el punto donde múltiples branches se mergean (similar afork_point). builtin_log(): Nuevo alias para el revset por defecto dejj log. Permite personalizarrevsets.logsin duplicar la expresión:
[revsets]
log = "builtin_log() + authors(@user)"
Comandos y flags nuevos
jj tag track/untrack: Asocia tags locales con remotes. Ejemplo:
jj tag track v1.0 origin
jj tag untrack v1.0
jj run:
--passthrough: Conecta stdout/stderr del subproceso directamente al terminal.– --ignore-changes: Evita modificar revisiones aunque el comando modifique el working copy.
– --ignore-errors: Continúa con las revisiones restantes si el comando falla.
jj file search:
--name-only.– Soporte para -n/--line-number para mostrar el número de línea.
Fixes críticos
| Issue | Descripción | Impacto |
|---|---|---|
| #9827 | Creación tardía de working-copy revision al volverse immutable | Podía dejar el working copy en estado inconsistente |
| #9752 |