Tengo un repositorio de GitHub que tenía dos ramas: master y release.
La rama de lanzamiento contenía archivos de distribución binarios que contribuían a un tamaño de repositorio muy grande (> 250 MB), así que decidí limpiar las cosas.
Primero eliminé la rama de lanzamiento remoto, a través de git push origin :release
Luego eliminé la rama de lanzamiento local. Primero lo intenté git branch -d release
, pero git dijo "error: la rama 'release' no es un antepasado de tu HEAD actual". lo cual es cierto, entonces lo hice git branch -D release
para forzar su eliminación.
Pero el tamaño de mi repositorio, tanto localmente como en GitHub, seguía siendo enorme. Entonces revisé la lista habitual de comandos de git, como git gc --prune=today --aggressive
, sin suerte.
Siguiendo las instrucciones de Charles Bailey en SO 1029969 pude obtener una lista de SHA1 para las manchas más grandes. Luego utilicé el script de SO 460331 para encontrar los blobs ... y los cinco más grandes no existen, aunque se encuentran blobs más pequeños, así que sé que el script está funcionando.
Creo que estos blogs son los binarios de la rama de lanzamiento, y de alguna manera se quedaron después de eliminar esa rama. ¿Cuál es la forma correcta de deshacerse de ellos?
Respuestas:
... y sin más preámbulos, puedo presentarles este útil comando, "git-gc-all", garantizado para eliminar toda su basura git hasta que puedan aparecer variables de configuración adicionales:
Es posible que también necesites ejecutar algo como esto primero, ¡oh, cielos, git es complicado!
Es posible que también deba eliminar algunas etiquetas, gracias Zitrax:
Puse todo esto en un script: git-gc-all-ferocious .
fuente
objects
. ¿Cuáles son esos y por qué son (aparentemente) irrelevantes?Como se describe aquí , si desea eliminar permanentemente todo lo que se hace referencia solo a través de reflog , simplemente use
git reflog expire --expire-unreachable=now --all
elimina todas las referencias de confirmaciones inalcanzables enreflog
.git gc --prune=now
elimina las propias confirmaciones.Atención : Solo el uso
git gc --prune=now
no funcionará ya que esas confirmaciones todavía se hacen referencia en el reflog. Por lo tanto, borrar el reflog es obligatorio. También tenga en cuenta que si lo usarerere
tiene referencias adicionales no borradas por estos comandos. Consultegit help rerere
para obtener más detalles. Además, cualquier confirmación a la que hagan referencia las ramas o etiquetas locales o remotas no se eliminará porque git las considera datos valiosos.fuente
git fetch --prune
reducir aún más el tamaño debido a la eliminación de blobs locales.Como se menciona en esta respuesta SO , ¡en
git gc
realidad puede aumentar el tamaño del repositorio!Ver también este hilo
El mismo hilo menciona :
En el frente de la rama de filtro, puede considerar (con cautela) este script
fuente
filter-branch
uso de comandos.git gc --prune=now
, o nivel bajogit prune --expire now
.fuente
Cada vez que tu HEAD se mueve, git rastrea esto en el
reflog
. Si eliminó las confirmaciones, todavía tiene "confirmaciones colgantes" porque todavía se hace referencia a ellasreflog
durante ~ 30 días. Esta es la red de seguridad cuando elimina confirmaciones por accidente.Puede usar el
git reflog
comando eliminar confirmaciones específicas, reempaquetar, etc., o simplemente el comando de alto nivel:fuente
Puede utilizar
git forget-blob
.El uso es bastante sencillo
git forget-blob file-to-forget
. Puedes obtener más información aquíhttps://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/
Desaparecerá de todas las confirmaciones en su historial, reflog, etiquetas, etc.
Me encuentro con el mismo problema de vez en cuando, y cada vez que tengo que volver a esta publicación y a otras, es por eso que automaticé el proceso.
Créditos a contribuyentes como Sam Watkins
fuente
Intente usar git-filter-branch ; no elimina las manchas grandes, pero puede eliminar los archivos grandes que especifique de todo el repositorio. Para mí, reduce el tamaño del repositorio de cientos MB a 12 MB.
fuente
A veces, la razón por la que "gc" no sirve de mucho es que hay un cambio de base sin terminar o un alijo basado en una confirmación anterior.
fuente
Para agregar otro consejo, no olvide usar git remote prune para eliminar las ramas obsoletas de sus controles remotos antes de usar git gc
puedes verlos con git branch -a
A menudo es útil cuando se obtiene de github y repositorios bifurcados ...
fuente
Antes de hacer
git filter-branch
ygit gc
, debe revisar las etiquetas que están presentes en su repositorio. Cualquier sistema real que tenga etiquetado automático para cosas como la integración continua y las implementaciones hará que los objetos no deseados aún sean referenciados por estas etiquetas, por lo tantogc
lo no puede eliminarlos y aún se preguntará por qué el tamaño del repositorio sigue siendo tan grande.La mejor manera de deshacerse de todas las cosas no deseadas es ejecutar
git-filter
ygit gc
y luego empujar master a un nuevo repositorio desnudo. El nuevo repositorio desnudo tendrá el árbol limpiado.fuente