Ho riscritto la cronologia del mio repository per rimuovere alcuni file FLV di grandi dimensioni utilizzando git filter-branch
. Io in primo luogo seguito l'articolo articolo Github su removing sensitive data e istruzioni simili trovate altrove su Internet:Perché esistono ancora file di grandi dimensioni nel mio file pack, dopo averli strofinati con il filtro-ramo?
Rimozione del grande FLV:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch public/video/*.flv' --prune-empty -- --all
Rimozione gli arbitri originali:
Cancellare il reflog:
git reflog expire --expire=now --all
Potare oggetti non raggiungibili:
git gc --prune=now
Aggressivly potatura gli oggetti non raggiungibili:
git gc --aggressive --prune=now
cose reimballaggio:
git repack -A -d
E la mia gitdir è ancora 205 MB, conteneva quasi interamente in un unico packfile:
$ du -h .git/objects/pack/*
284K .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.idx
204M .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.pack
Utilizzando this script, posso vedere che il file FLV ho rimosso sono ancora contenuti nella confezione:
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
....
clonazione del repository tramite git clone --bare my-repo
rendimenti my-repo.git
che è anche 205MB di dimensione.
Cosa posso fare per rimuovere questi oggetti (presumibilmente) non referenziati dal pacchetto e ridimensionare il mio repository alla dimensione che sarebbe se non fossero mai stati impegnati? Se sono ancora referenziati in qualche modo, c'è un modo per dire dove?
Aggiornamento
momento di tentare di eseguire nuovamente git filter-branch
, ho ricevuto questo avviso:
Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f
ho verificato che ci fossero non arbitri in .git/refs/original
, infatti, la directory non ha fatto esiste del tutto. C'è qualche altro modo che git memorizza i refs, di cui non so nulla?
clonazione del repository tramite 'git clone --bare rendimenti my-repo'' my-repo.git' che è anche 205MB di dimensione, in modo che nessun; il packfile e il suo enorme contenuto arrivano con il clone. – meagar
La tua risposta cancellata è interessante e potrebbe essere utile ad altri: prendi in considerazione la possibilità di modificare la tua domanda per descrivere l'ordine reale dei comandi che hai fatto e quindi di rimandare una risposta spiegando i refs refs/original' imballati? (È un punto sottile che puoi avere refs che esistono solo nei file pack, e non un file sotto 'refs'.) –
@MarkLongair Sto ancora giocando, cercando di riprodurre i risultati dalla mia risposta cancellata. Ho clonato il repository e ho scoperto che l'esecuzione di 'git repack -a' * prima che * eseguendo' rm -rf .git/refs/original' ** non ** sembra influire sul risultato. Non sembra influenzare il contenuto di '.git/refs/original'. – meagar