El capítulo 9 del libro Pro Git tiene una sección sobre la eliminación de objetos .
Permítanme describir brevemente los pasos aquí:
git filter-branch --index-filter \
'git rm --cached --ignore-unmatch path/to/mylarge_50mb_file' \
--tag-name-filter cat -- --all
Como la opción de rebase descrita anteriormente, filter-branches la operación de reescritura. Si tiene un historial publicado, tendrá que --forceimpulsar las nuevas referencias.
El filter-branchenfoque es considerablemente más poderoso que el rebaseenfoque, ya que
- le permite trabajar en todas las ramas / referencias a la vez,
- cambia el nombre de las etiquetas sobre la marcha
- funciona limpiamente incluso si ha habido varias confirmaciones de fusión desde la adición del archivo
- funciona limpiamente incluso si el archivo fue (re) agregado / eliminado varias veces en el historial de (una) rama (s)
- no crea nuevas confirmaciones no relacionadas, sino que las copia mientras modifica los árboles asociados con ellas. Esto significa que se conservan cosas como confirmaciones firmadas, notas de confirmación, etc.
filter-branch también mantiene copias de seguridad, por lo que el tamaño del repositorio no disminuirá de inmediato a menos que expire los reflogs y la recolección de basura:
rm -Rf .git/refs/original # careful
git gc --aggressive --prune=now # danger