crear - ¿Cómo eliminar REALMENTE una rama git(es decir, eliminar todos sus objetos/confirmaciones)?
git pull (2)
Tengo un árbol git como
A---B---C topic
/
D---E---F---G master <--
Me gustaría eliminar el tema y todos los objetos en él.
Tomo nota de la SHA ID del tema, luego escribo:
git branch -D topic
git gc # <-- I also tried prune here...
git checkout -b temp <SHA1 ID of topic>
Después del último comando espero recibir un error (algo como "ID de objeto inexistente ..." o algo así). Sin embargo, no hay ningún error y gitk muestra la misma estructura de árbol que la anterior.
¿Qué me estoy perdiendo? ¿Pensé que se supone que gc / prune deben eliminar todos los objetos inalcanzables?
A menudo, la prune gc no es suficiente para deshacerse de los objetos adicionales en el repositorio. Si aún se hace referencia a los compromisos en el reflog, no se considerará que esos objetos son inalcanzables y, por lo tanto, están listos para la poda.
Esto es lo que funcionó para mí:
git reflog expire --expire=now --all
git gc --aggressive --prune=now
git repack -a -d -l
Esto hará algunos cambios en el historial de su repo y puede presentar dificultades si otros dependen de las ramas que se quitan.
Puede que tenga que volver a clonar su repositorio para ver realmente una diferencia en su tamaño.
Nota de mayo de 2010: Como lo mencionó Jakub , si su rama se fusionara, el tema aún sería accesible.
Aquí, supongamos que no hubo fusión.
Luego, como se menciona en el libro de ProGit y se detalla en esta pregunta de SO :
git gc --prune=now
debería ser suficiente (deberías llamar directamente a git prune
). Puedes controlar eso con un git count-objects -v
.
Edición de abril de 2012: en los comentarios, confirma que podrían requerirse pasos adicionales, como se detalla en la answer (pero sin el git repack
).
Así que en lugar de un git gc --prune now
:
git reflog expire --expire=now --all
git gc --aggressive --prune=now