GIT ¿Cómo se limpia el historial de files borrados?

Importé un proyecto SVN muy antiguo, con git svn clone. El problema fue que recogí la carpeta raíz de ese repository, donde ya había importado todos los demás subproyectos (en nuevos repositorys git), y cada uno fue eliminado de SVN. Por lo tanto, al importar la carpeta raíz (con las últimas 8 subcarpetas) en un único repository git, también se importó todo el historial para el repository completo (incluido el historial de subproyectos eliminados).

Hice varios commands para limpiar el file del package, sin éxito. Siempre tiene 571Mb. El único command que lo networkingujo un poco fue:

git repack -a -d --depth=500 --window=1000 -f 

Google, encontré muchas ayudas para eliminar files, o eliminar el historial de grandes blobs, pero no para los files ya desaparecidos.

Creé una list con todas las carpetas eliminadas que necesito desvanecer (solo las carpetas de nivel superior en esta list), con este command:

 git log --diff-filter=D --summary | grep delete | cut -d" " -f5 | cut -d"/" -f1 | grep -v "\"" | sort | uniq > /tmp/tokill.txt 

Luego, hice esto (después de una pequeña edición, para preservar 2 carpetas de eliminación de historial):

 git filter-branch --index-filter 'cat /tmp/tokill.txt | xargs git rm --cached --ignore-unmatch -r' 

En este momento, el logging fue una especie de reescritura. Ya no pude enumerar los files eliminados. Pero el package aún tenía un tamaño de 571Mb, incluso después de reempaques, gc y / o ciruela.

¿Qué me estoy perdiendo? Cualquier ayuda es apreciada.

Lo mejor, Lovato


AÑADIDO en 2014-08-05:

Solo para aclarar un poco más: ya conservé el historial de sub-proyectos individuales porque ya los he migrado a git. Después de eso, estas carpetas se borraron de svn. Entonces, realmente quiero deshacerme de la historia, porque no pertenece a este scope. Entiendo que es raro de hacer, pero me gustaría saber si puedo hacerlo o no.

Divideré un enorme repository SVN en varios repositorys git para facilitar la vida de todos. Este repository SVN original tiene 6 años, y toneladas ^ 2 de SVN se comprometen, así que no puedo cavar uno por uno para verificar si se eliminará o no.

Sobre el tamaño, sin ese historial (que contiene el historial de grandes blobs) tiene less de 1Mb. Es solo un montón de código Java, documentos y algunas imágenes.

La (quizás) forma correcta era mover primero todas esas carpetas a una carpeta llamada "last_project", y luego svn-git clonar este "last_project", y todo el historial perteneciente a "/" (lo que significa TODO el historial) permanecería en SVN.


AÑADIDO el 2014-08-05 – II: solución parcial

Al revisar mi pregunta, Stackoverflow comenzó a sugerir otra pregunta similar que no encontré antes, porque solo están relacionadas. Una de ellas es sobre la herramienta BFG. La herramienta BFG no borra "la historia de los files que ya no existen en el disco", pero hizo un buen trabajo borrando todo el historial de files que eran (algunos cuando) más grandes que X kb. Entonces, el tamaño total de mi repository ahora es de 20Mb, y Jenkins (y todos) pueden downloadlo en 2 segundos a partir de ahora.

http://rtyley.github.io/bfg-repo-cleaner/

Todavía tengo una copy desnuda de mi repository original para aplicar cualquier solución que pueda sugerirse.


AÑADIDO en 2014-08-06:

Tuve que eliminar completamente mi antiguo repository git, crear uno nuevo, y ellos empujar el repository recién reescrito. Está funcionando ahora. No de la manera que quería, pero funcionaba.

Parece que quiere elementos que estuvieron presentes en el pasado pero que ya no son parte del repository que se eliminará de git.

Desafortunadamente, git no funciona así. Debido a que estos elementos son parte del historial (es decir, todavía hay twigs / references / tags dando vueltas que hacen reference a estos commits en su historial), se quedarán y también lo harán los objects relacionados con esos commits.

La única forma de eliminarlos por completo sería eliminarlos de su historial de git. Si tiene una twig que se refiere a ellos, puede eliminar esa twig o volver a establecer una base para que no incluya esas confirmaciones. De cualquier manera, la recolección de basura de git entrará en acción y se deshará de ellos.

Sin embargo, ¿por qué quieres hacer esto? 571MB no es particularmente grande y eliminará el historial por completo.

Otra forma de hacer esto es:

  1. Crea un repository vacío en otro lugar
  2. Cree una confirmación de raíz vacía en este nuevo repository ( git commit --allow-empty -m 'root commit' )
  3. Agregue el repository git-svn como control remoto (no tendrán nada en común)
  4. Agregue una nueva twig local que rastree la twig remota que desea
  5. Rebase esta twig local en su nueva confirmación de raíz vacía.
  6. Cuando haya terminado, rebase de forma interactiva ( rebase -i ) una vez más y fixup las confirmaciones que no desea (esto esencialmente combinará todas ellas en una confirmación con el efecto de que todos los files eliminados se eliminarán, pero cualquier cambio en los files que existen persistirán a través de la historia).
  7. Resuelve cualquier conflicto Cuando haya terminado, tendrás un repository git nuevo y puro con solo el historial que necesitas.
  8. Retire el control remoto.
  9. Ejecute git gc

Su nuevo repository ahora debería ser mucho más pequeño y su repository original de git-svn no debería tocarse.

Hay un gotcha: debe tener en count que git-svn no respetará svn externals en su repository svn original y, por lo tanto, solo puede confiar en el repository git-svn si su repository svn no utiliza externos.

ACTUALIZAR

Separar los subproyectos está bien siempre y cuando se conserven las interdependencies. Por ejemplo:

 In order to build Parent project version 45, you need: version 2 of sub-project A version 10 of sub-project B ... version 30 of sub-project Z