repositorio remote que eliminar ejemplo borrar archivos archivo git git-filter-branch

que - git remote add



¿Por qué siguen existiendo archivos grandes en mi paquete de archivos, después de limpiarlos con filtro-rama? (1)

Al clonar una copia nueva del repositorio, pude ejecutar los comandos exactamente como se indicó anteriormente y lograr el resultado deseado: mi directorio .git se redujo de 205 MB a 20 MB, y los archivos FLV grandes se eliminaron limpiamente del archivo. paquete de archivos

El primer intento también se realizó en un clon nuevo en el que no había realizado modificaciones, por lo que no tengo una explicación satisfactoria de por qué los archivos FLV continuaron dentro del paquete de archivos.

Originalmente presenté la respuesta a continuación, pensando que había causado un problema al ejecutar git repack -a antes de eliminar .git/refs/original , lo que provocó que los refs originales se empaquetaran de manera que cuando .git/refs/original allí no tuvo efecto; Mis referencias originales seguirían haciendo referencia a los grandes archivos FLV. Sin embargo, esto no parece mantenerse. Ejecutar los comandos anteriores en una copia recién clonada del repositorio con la adición de git repack -a inmediatamente después de que git filter-branch no parece afectar el resultado), los archivos FLV aún se eliminan del archivo de paquetes. No tengo ninguna razón para creer que esto sea relevante para el problema original.

¿Hay alguna otra forma en que git almacene refs, que no conozco?

Hay Resulta que no era del todo sincero sobre el orden de los comandos como se indica arriba. Había ejecutado git repack -a antes de ejecutar rm -rf .git/refs/original , y Git había guardado los refs (por determinar dónde; experimentando ahora). Cuando ejecuté rm -rf .git/refs/original , no se eliminó nada. git gc no pudo reducir mi paquete de archivos porque aún tenía referencias persistentes a los archivos antiguos debido a las refs/original empaquetadas refs/original referencias refs/original .

He reescrito el historial de mi repositorio para eliminar algunos archivos FLV grandes usando git filter-branch . Principalmente seguí el artículo del artículo de Github sobre la eliminación de datos confidenciales e instrucciones similares que se encuentran en otras partes de Internet:

Eliminando los FLV grandes:

git filter-branch --index-filter ''git rm --cached --ignore-unmatch public/video/*.flv'' --prune-empty -- --all

Eliminando las referencias originales:

rm -rf .git/refs/original/

Limpiando el reflog:

git reflog expire --expire=now --all

Poda de objetos inalcanzables:

git gc --prune=now

Recorte agresivo de objetos inalcanzables:

git gc --aggressive --prune=now

Reempaquetar cosas:

git repack -A -d

Y mi gitdir todavía tiene 205 MB, contenido casi en su totalidad en un único paquete de archivos:

$ du -h .git/objects/pack/* 284K .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.idx 204M .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.pack

Al usar este script , puedo ver que los FLV que he eliminado todavía están contenidos en el paquete:

All sizes are in kB''s. The pack column is the size of the object, compressed, inside the pack file. size pack SHA location 17503 17416 1be4132fa8d91e6ce5c45caaa2757b7ea87d87b0 public/video/XXX_FINAL.flv 17348 17261 b7aa83e187112a9cfaccae9206fc356798213c06 public/video/YYY_FINAL.flv ....

Al git clone --bare my-repo el repositorio a través git clone --bare my-repo obtiene my-repo.git que también tiene un tamaño de 205MB.

¿Qué puedo hacer para eliminar estos objetos (presumiblemente) no referenciados del paquete y reducir mi repositorio al tamaño que sería si nunca se hubieran confirmado? Si todavía están referenciados de alguna manera, ¿hay una manera de decir dónde?

Actualizar

Al intentar volver a ejecutar git filter-branch , recibí este aviso:

Cannot create a new backup. A previous backup already exists in refs/original/ Force overwriting the backup with -f

Verifiqué que no había refs en .git/refs/original , de hecho, el directorio no existía en absoluto. ¿Hay alguna otra forma en que git almacene refs, que no conozco?