Tenemos un proyecto de git que tiene una gran historia.
Específicamente, al principio del proyecto había bastantes archivos de recursos binarios en el proyecto, estos ahora se han eliminado ya que son recursos efectivamente externos.
Sin embargo, el tamaño de nuestro repositorio es> 200 MB (el pago total actualmente es de ~ 20 MB) debido a que estos archivos se han confirmado previamente.
Lo que nos gustaría hacer es "colapsar" el historial para que el repositorio parezca haber sido creado a partir de una revisión posterior a la anterior. Por ejemplo
1-----2-----3-----4-----+---+---+
\ /
+-----+---+---+
- Repositorio creado
- Se agregó un gran conjunto de archivos binarios
- Gran conjunto de archivos binarios eliminados
- Nuevo 'inicio' previsto del repositorio
Así que efectivamente queremos perder el historial del proyecto antes de cierto punto. En este punto solo hay una rama, por lo que no hay ninguna complicación al tratar de lidiar con múltiples puntos de inicio, etc. Sin embargo, no queremos perder todo el historial y comenzar un nuevo repositorio con la versión actual.
¿Es esto posible o estamos condenados a tener un repositorio inflado para siempre?
fuente
Puede usar
git filter-branch
con injertos para hacer que la confirmación número 4 sea la nueva confirmación raíz de su rama. Solo crea el archivo.git/info/grafts
con solo una línea que contiene el SHA1 de la confirmación número 4.Si ahora hace un
git log
ogitk
verá que esos comandos mostrarán el compromiso número 4 como la raíz de su rama. Pero nada habrá cambiado realmente en su repositorio. Puede eliminar.git/info/grafts
y la salida degit log
ogitk
será como antes. Para que la confirmación número 4 sea la nueva raíz, tendrá que ejecutarlagit filter-branch
, sin argumentos.fuente
git gc --prune=0
no parece limpiarlos.git gc --prune=now
limpia físicamente todas las confirmaciones a las que ya no se hace referencia. Si esto no funciona para usted, es posible que tenga alguna rama de seguimiento remoto que aún haga referencia a la raíz anterior. Enumere congit branch -r
, luego elimine la rama remota, por ejemplo, congit branch -rd origin/master
y luegogit gc --prune=now
vuelva a ejecutar .Gracias a la publicación de JesperE que miré
git-filter-branch
, puede que eso sea lo que quieres. Parece que también podría conservar sus confirmaciones anteriores, excepto que se modificarían ya que se eliminaron sus archivos grandes. Desde la página de manual de git-filter-branch :Asegúrese de leer esa página de manual ... obviamente, querrá hacer esto en un clon de repuesto de su repositorio para asegurarse de que funcione como se espera.
fuente
¿Es
git-fast-export
lo que buscas?fuente