Git elimina files del historial sin duplicar confirmaciones previas a la sucursal

Cómo generalmente procedo:

En realidad, para eliminar algunos files del historial completo, utilizo el siguiente script (que llamo git-crunch):

#!/bin/bash # # git crunch <filenames> # git filter-branch --index-filter "git rm --cached --ignore-unmatch $*" rm -rf .git/refs/original/ git reflog expire --expire=now --all git fsck --full --unreachable git repack -A -d git gc --aggressive --prune=now 

Funciona perfectamente para eliminar files especificados del historial (completo).

El context es:

Tengo 1 proyecto que se divide en 4 twigs. Aquí hay un diagtwig de networking resumido que muestra 2 de las 4 twigs mantenidas:

 ┏ a937fd9 (1 year, 9 months ago) <new repo> ... 60 commits later, we create a branch "probe" which is displayed at left of the network ... ┣━┓ ┣ ┃ c483a22 (8 months ago) ┃ ┣ f7b402c (3 months ago) ... ┃ ┣━┓ ┣ ┃ ┃ 38bb93d (11 days ago) ┣ ┃ ┃ 1ef8202 (11 days ago) ┃ ┃ ┣━[remotes/origin/S...H_adjust]──adb243f (8 days ago) ┃ ┣ ┃ cd02775 (8 days ago) ┃ ┣━┛ ┃ ┣ f9e40a3 (8 days ago) ┃ ┣ a30eb6f (7 days ago) ┃ ┣━[remotes/origin/S...H_verif]──4a3fe66 (7 days ago) ┃ ┗━[remotes/origin/HEAD]──[remotes/origin/master]──b452f85 (7 days ago) ┣ 91477ae (4 days ago) ┗━[HEAD]──[probe]──[remotes/origin/probe]──366c890 (48 minutes ago) 

Mi probolem es:

Tengo 3 files enormes en este repository que podrían eliminarse desde el principio (creación del repository) pero si uso mi secuencia de commands, solo se ejecutará en una twig y recreará 4 twigs separadas desde el principio hasta la última confirmación. que sucedió hoy.

Mi pregunta:

¿Cómo puedo lograr estos 3 files de eliminación de toda mi historia sin separar mis twigs desde el principio? O, ¿hay alguna forma de reescribir toda la historia y eliminar files de todas las twigs a la vez para que pueda mantener mi networking de evolución y confirmaciones "compartidas" intactas (para que mis primeros 61 commits no se dupliquen cuatro veces)?

La mejor herramienta para hacerlo es en realidad The BFG Repo Cleaner , una alternativa más simple y más rápida a git filter-branch . Por ejemplo:

 $ bfg --strip-blobs-bigger-than 10M 

… elimina todos los blobs de más de 10MB (que no están en tu última confirmación) y funciona en todas las twigs y tags de tu repository.

Descripción completa: soy el autor de BFG Repo-Cleaner.