Bitácora

Los snapshots, y dónde viven

Un snapshot es una copia de tu árbol de trabajo, tomada en local, que no es un commit. No tiene padre, ni mensaje que merezca la pena escribir, ni sitio en tu…

Un snapshot es una copia de tu árbol de trabajo, tomada en local, que no es un commit. No tiene padre, ni mensaje que merezca la pena escribir, ni sitio en tu historia, ni forma de llegar a un remoto. Existe para que lo siguiente destructivo que hagas sea reversible.

history · pushed c1 c2 c3 c4 snapshot a1f before rebase snapshot 9c2 before reset --hard reset --hard torii snapshot restore 9c2 snapshots live in .git/torii/snapshots · never committed · never pushed

Por qué no un commit

Git ya tiene tres respuestas a «déjame guardar esto un segundo»: un commit WIP, un stash y el reflog. Cada una cobra un peaje. El commit WIP ensucia la historia que luego tendrás que limpiar. El stash es una única pila sin nombres, y aplicar la entrada equivocada es cara o cruz. El reflog no es un guardado en absoluto: registra dónde apuntaban las refs, así que recupera una rama, no el fichero sin commitear que acabas de sobrescribir.

Un snapshot es el que falta: con nombre, listable, restaurable por id, e invisible para todos los demás.

Dónde viven, y el fallo que lo decidió

Los snapshots se escriben en <gitdir>/torii/snapshots — dentro de .git, no al lado.

No empezaron ahí. Empezaron en un directorio junto al árbol de trabajo, lo cual va bien hasta que alguien ejecuta torii save -a. add_all recorre el árbol, encuentra el directorio de snapshots y lo indexa. Un repositorio produjo así un commit de 681 MB y un push que no terminaba nunca.

Dentro de .git el problema no puede repetirse, porque el indexado nunca entra ahí. Merece decirse claro en vez de arreglarlo en silencio: durante un tiempo, el mecanismo de seguridad fue lo que rompía el repositorio.

Qué toma uno automáticamente

Toda reescritura de torii history. save --reset --reset-mode hard. worktree remove. reauthor y mailmap apply. En todos los casos el snapshot se toma antes de tocar el primer objeto, así que torii snapshot restore <id> deja el árbol exactamente como estaba.

También puedes tenerlos por reloj:

torii config set snapshot.auto_enabled true
torii config set snapshot.auto_interval_minutes 30

El intervalo puede vivir en .torii/auto-interval, que viaja con el proyecto en vez de con tu máquina — útil cuando el proyecto es de esos donde media hora de trabajo perdido importa.

El que sigue roto

torii snapshot stash a veces informa de éxito sin haber guardado nada. Es conocido, no está arreglado en 0.13.0, y hasta que lo esté el camino que siempre funciona es torii snapshot create -n "wip". Una red de seguridad con un agujero intermitente merece documentarse más alto que una función nueva.