Git: Eliminar los objects asociados con un antiguo commit

Hace un par de meses, agregué y comprometí un tarball de lanzamiento a un repository de código git. Un par de commits más tarde, eliminé el file y cometí la eliminación. Este file era casi 10 veces el tamaño del repository completo, por lo que la presencia de ese file en .git networkinguce la clonación de forma significativa. En este punto, ha habido cientos de confirmaciones desde el par de confirmaciones que agregaron y eliminaron el file.

¿Hay alguna forma de eliminar los dos commits que se cancelan (el add y el remove) y también eliminar la copy del file en .git, sin regar el repository?

Gracias..

Puedes hacer una git rebase y escribir los commits fuera del historial; sin embargo, esto cambiará los ids de todos los commits. No hay forma de evitarlo, es por layout.

Entonces, diga que el compromiso donde agregó el tarball fue maestro ~ 100. Si haces un git rebase -i master~101 en master , entonces se te presentará la list de commits para leer y editar. Simplemente puede sacar los commits que lo agregaron y eliminaron, o alternativamente mover el commit de cancelación para que esté junto al primero y marcarlo como "squash": eso hará que git combine los dos, y debería darse count de que el el resultado es nulo (pero lo hará en caso de que los dos no se cancelen con precisión, por lo que este enfoque es un poco más seguro).

Eche un vistazo a git filter-branch. Esta es la mejor herramienta para reescribir la historia. La página man tiene algunos buenos ejemplos.

Si otros usan el repository, asegúrese de que se den count de que obtendrán una twig maestra que excluya sus últimas confirmaciones. Ahora deberían ramificarse a algo como la temperatura y hacer una búsqueda de git.

Ahora pueden usar Gitk –all para ver exactamente dónde estaba la divergencia y rebase para volver a sincronizarse con los SHA-1 alterados de las confirmaciones posteriores al compromiso que solía tener el file gigante.