Adelgaza un repository git con bfg

Ante un agregado anárquico de files binarys por un codificador, cómo adelgazar un repository git no solo elimina los files problemáticos sino también su historial en el tree.

Intenté usar bfg pero como funciona en el repository desnudo duplicado, he tenido dificultades para get todo el flujo de trabajo, y necesito recostackr respuestas de diferentes lugares en la web.

Lo que finalmente funcionó para mí es ir y venir entre repositorys desnudos duplicates y repositorys normales. Puede parecer largo, pero realmente tiene todos los pasos de un gran representante a uno pequeño y en realidad es rápido (10 millones de empleos).

Primero, obtenga un repository duplicado local para la última versión con todo el desorder (que puede llevar mucho time a través de Internet. Es el único paso que puede llevar mucho time):

git clone --mirror http://myservice.org/myrepo 

Luego, copie el resultado con fines de copy de security (no estoy bromeando, lo usaremos al final):

 cp -r myrepo.git myrepo.git.bak 

Luego crea una versión normal desde la versión simple para que puedas limpiar:

 mkdir myrepo.small cd myrepo.small mkdir .git cd .git cp -r ../../myrepo.git/* . cd .. git config --local --bool core.bare false 

Y suponiendo que la limpieza se haga en la twig principal:

 git checkout master 

Para limpiar, vea los grandes repertorios con:

 du -sh * 

Y elimínelos (incluso si desea evitar que se actualicen, los volveremos a poner más tarde) con:

 git rm bigThings 

Si solo quiere conservar algunos de los files pero eliminarlos del historial de git, puede usar git rm --cached bigFile pero me pareció más fácil eliminar todo, limpiar el historial y luego volver a savelos.

Con la frecuencia que desee y al less cuando termine de limpiar:

 git commit -m "big clean up" 

Podría intentar enviar el resultado al repository duplicado, pero me resultó más fácil crear uno nuevo (desde la carpeta principal del repository):

 rm -rf myrepo.git git clone --mirror myrepo.small 

Finalmente descargue el bfg (necesita instalar java) y ejecute en el clon duplicado. Quería eliminar el historial de todo lo que superase los 5M y mi versión descargada del bfg estaba en ~/Downloads/bfg-1.12.5.jar así que utilicé:

 java -jar ~/Downloads/bfg-1.12.5.jar --strip-blobs-bigger-than 5M myrepo.git 

Confirme la limpieza (con verificación del tamaño antes y después):

 cd myrepo.small.git du -sh git reflog expire --expire=now --all && git gc --prune=now --aggressive du -sh 

Debería sentirse más ligero. En este punto encontré:

 git push ../myrepo 

no funciona, así que lo creé nuevamente desde el espejo limpio:

 rm -rf myrepo.small mkdir myrepo cd myrepo mkdir .git cd .git cp -r ../../myrepo.small.git/* . cd .. git config --local --bool core.bare false git checkout master 

De hecho, también encontré más fácil eliminar mi repository (en bitbucket) y recrearlo vacío. Cuando todo está bien, configure el repo central correcto en .git / config y git push

Para volver a colocar en la carpeta los elementos problemáticos que utilicé al unísono en una versión normal del repository copydo al principio.

Primero crea una versión normal de la copy de security

 mkdir myrepo.bak cd myrepo.bak mkdir .git cd .git cp ../../myrepo.git/* . git config --local --bool core.bare false git checkout master cd .. 

luego corre al unísono en los dos

 unison myrepo myrepo.bak 

Y devolvió lo que necesitaba. Un zip de eso en filesender u otro sustituto de un usb stick para enviar a todos los queueboradores y estamos listos y funcionando nuevamente.