¿Cuál es la forma más rápida de eliminar completamente varios files de todo el historial de git?

Estoy migrando un repository SVN con varios años de historia y aproximadamente 50,000 confirmaciones. Usé git-svn para crear una export de Git del repository SVN.

Nuestro repository SVN fue creado originalmente con la siguiente estructura:

  1. Cada Proyecto en la Compañía tenía su propia carpeta que contenía una carpeta Troncal / Etiquetas / Sucursales
  2. El código fuente para las bibliotecas compartidas estaba en otra carpeta y contenía su propia carpeta Troncal y Sucursales
  3. Los files binarys solían registrarse en SVN luego de una compilation exitosa y se creó una label

Después de la export de git-svn, tengo un repository Git de poco más de 15 GB y necesito hacer una limpieza seria. Durante la export de SVN, nuestras carpetas de tags y sucursales se trataron como files regulares, por lo que quiero comenzar eliminándolos de nuestro repository de Git mientras conservamos nuestro historial de confirmaciones.

La única forma que conozco de deshacerme de un file completamente de un repository de Git es usando git filter-branch , así que creé un script para examinar recursivamente las carpetas de tags para cada proyecto, generando un command como este para cada file:

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch ./FS/Tags/v2.2.32/Handheld/FSFormView.cpp' --prune-empty --tag-name-filter cat -- --all

Mi problema es que tengo casi 450,000 líneas como esta en mi script generado ya que necesito ejecutarlo para cada file. Ejecutar esto una vez es una operación bastante costosa, y me temo que ejecutar todo el script literalmente llevará una eternidad.

En lugar de ejecutar múltiples filter-branch que llegan a eliminar una única ruta, en su lugar tienen una única filter-branch que ejecuta una secuencia de commands que elimina todas las routes.

Por supuesto, si solo desea deshacerse de todas las tags, considere esto en su lugar:

 git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch ./FS/Tags' --prune-empty --tag-name-filter cat -- --all 

No es necesario especificar individualmente los files; git rm -r recurrirá.

Whoa, copy de security. git-svn está diseñado para convertir sus tags y twigs en tags y twigs de Git, pero no puede hacerlo si está utilizando una estructura de directorys inusual.

Es casi seguro que desee tener un repository de git separado para cada uno de estos proyectos, con sus propias tags y twigs. Utilizaría --trunk , --tags , y --branches para contar git-svn donde vive cada proyecto y convertir cada uno por separado. También podría usar --ignore-paths para evitar migrar los binarys a git en primer lugar.

Incluso si tener un gran repository al final es un requisito absoluto (y hago hincapié en que esta es una idea realmente mala), será mucho más rápido rehacer la conversión de git-svn con --ignore-paths para que nunca tenga los files no deseados en git en primer lugar.