deshacer "git filter-branch … – –all"? en un command?

Empecé a jugar con git filter-branch . La opción –todos reescribe todas las twigs y tags. Guay. git filter-branch crea una copy de security de todas las references que sobrescribe en refs / original. Muy genial. Ahora me gustaría volar toda mi experimentación con filter-branch distancia.

¿Hay alguna manera fácil de deshacer por completo los efectos de git filter-branch <whatever filter> -- --all ? Es decir, restaurar todas las twigs reescritas a su estado original, todo a la vez.

Si no hay un path preexistente, debería haberlo. Si no hay una forma preexistente, ¿alguien tiene un guión corto que lo haga?

Obviamente hay soluciones temporales. Podría restaurarlo manualmente, una twig a la vez, como en esta pregunta . O podría simplemente nuclear y volver a clonar. O se volvería tedioso rápidamente en un repository con muchas sucursales / tags que (por ejemplo) se dividen en repositorys más pequeños.

Aquí hay una manera simple y segura de deshacer una twig de filter:

 git fetch . +refs/original/*:* 

Si la twig actualmente desprotegida ( HEAD ) es una de las twigs que se restaurará, este command fallará. Puede ejecutar git checkout --detach antemano para que git fetch actualice todas las twigs. ¡Restring pagar una sucursal después de ejecutar git fetch !

Una vez que los refs se han restaurado con éxito, puede eliminar los refs/original refs refs/original forma segura con este command:

 git for-each-ref refs/original --format='delete %(refname) %(objectname)' | git update-ref --stdin 

Respuesta anterior:

 git for-each-ref refs/heads refs/tags \ --format='git update-ref "%(refname)" "%(refname)@{1 hour ago}"' 

Para mayor security, podría probar si la twig de filter realmente actualizó la reference:

 git for-each-ref refs/heads refs/tags --format=' { git reflog -1 "%(refname)" | sed -n "/filter-branch: rewrite$/Q1"; } \ || git update-ref -m "reset to before filter-branch" \ %(refname) %(refname)@{1}' | sh -x 

Ehmm, mueve todas las references de .git/refs/original a su lugar en .git/refs/heads ? Me refiero literalmente a moverse, estos son files de text sin formatting. También puede echar un vistazo a .git/packed-refs si existe.