Docs

Cirugía de historia

Reescribir la historia es la operación para la que la gente echa mano de git filter-repo, ejecuta una vez cada dos años y hace mal. torii trae toda la superficie como subcomandos de primera clase construidos sobre un solo motor de reescritura de árboles, con las mismas tres garantías en todos: un snapshot de seguridad antes de tocar el primer commit, fechas de autor y de committer preservadas por defecto, y negativa a arrancar con el árbol sucio o con una operación pendiente.

pre-flight dirty tree? stop snapshot taken by default rewrite the tree dates preserved refs and working tree moved to the new history torii snapshot restore <id> if the result is wrong signatures do not survive a rewrite (re-sign with torii sign) · the push that follows is a force push

Las garantías

Todos los comandos de esta página toman un snapshot primero. Si el resultado está mal:

torii snapshot list
torii snapshot restore <id>

Pasa --dry-run para ver qué cambiaría sin cambiarlo, --since <ref> para acotar la reescritura a un rango, y --no-snapshot si tienes tu propia copia y quieres la velocidad.

Las firmas GPG no sobreviven a una reescritura — el objeto commit cambia, así que la firma sobre él ya no verifica. Vuelve a firmar después con torii sign.

Mensajes

torii history reword <hash> -m "fix: the message it should have had"
torii history reword <hash> -F message.txt
torii history reword --map rewrites.txt        # one "<hash> <message>" per line

Contenido, autor, committer y fechas quedan intactos. Este es el camino no interactivo que antes obligaba a usar git filter-repo.

Identidad

torii history reauthor --old "Old Name <old@example.com>" --new "New <new@example.com>"
torii history reauthor --old old@example.com --new "New <new@example.com>" --committer
torii history mailmap apply
torii history mailmap apply --file other.mailmap --dry-run

Las etiquetas anotadas también se reescriben, para que la identidad de quien etiquetó no quede como el último rastro del nombre viejo.

Fechas

torii history redate <hash> --date "2026-01-01T09:00:00+01:00"
torii history redate --map dates.txt
torii history rewrite "2026-01-01" "2026-03-01"    # shift a whole range

Contenido

torii history replace-text --literal 'OLD==>NEW'
torii history replace-text --regex 'AKIA[0-9A-Z]{16}==>***REMOVED***'
torii history replace-text --rules rules.txt --paths src
torii history replace-text --redact-secrets

--redact-secrets redacta todas las líneas que marca el escáner incorporado, que es la forma más rápida de limpiar un repositorio tras commitear una clave. Rótala igualmente: fue pública en el momento del push.

Rutas

torii history filter-path --keep src --keep Cargo.toml
torii history filter-path --remove vendor
torii history filter-path --subdirectory crates/torii     # promote a subdir to the root
torii history filter-path --rename old/path:new/path
torii history remove-file secrets.env                      # purge one file entirely

Añade --prune-empty para descartar los commits que se quedan vacíos cuando desaparecen sus únicos cambios.

Cualquier otra cosa

torii history exec-filter 'cargo fmt --all'

Ejecuta un comando contra el árbol materializado de cada commit — el clásico filter-branch --tree-filter, sin las veinte líneas de shell alrededor.

Después de una reescritura

La reescritura es local. Los demás siguen teniendo la historia vieja, y el siguiente push tiene que ser forzado:

torii sync --force

Quien tuviera la rama vieja tendrá que resetear sobre la nueva. En una rama compartida, acuerda la reescritura antes de ejecutarla, no después.