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.
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 lineContenido, 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-runLas 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 rangeContenido
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 entirelyAñ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 --forceQuien tuviera la rama vieja tendrá que resetear sobre la nueva. En una rama compartida, acuerda la reescritura antes de ejecutarla, no después.