2012-01-05 14 views
85

Ho eseguito il commit con id 56f06019 (ad esempio). In quel commit ho commesso per errore file di grandi dimensioni (50Mb). In un altro commit aggiungo lo stesso file ma nella giusta dimensione (piccolo). Ora il mio repo quando ho clone è troppo pesante :(Come rimuovere file di grandi dimensioni che dalla storia di pronti contro termine per ridurre le dimensioni del mio repoGit: come rimuovere il file dal commit storico?

+0

nel mio caso, non è un file di grandi dimensioni, ma un file di configurazione che contengono crediti di database. Stavo studiando git, a quel tempo non ero a conoscenza di .gitignore. – Rashi

+0

possibile duplicato di [Come rimuovere/eliminare un file di grandi dimensioni dalla cronologia dei commit nel repository Git?] (Http: // stackoverflow.it/questions/2100907/how-to-remove-delete-a-large-file-from-commit-history-in-git-repository) –

risposta

123

Il capitolo 9 del documento Pro Git contiene una sezione su Removing Objects.

Permettetemi di delineare i passi qui brevemente:

git filter-branch --index-filter \ 
    'git rm --cached --ignore-unmatch path/to/mylarge_50mb_file' \ 
    --tag-name-filter cat -- --all 

Come l'opzione ribasamento descritto in precedenza, filter-branch sta riscrivendo il funzionamento. Se hai già pubblicato la cronologia, dovrai inserire lo --force spingendo i nuovi riferimenti.

L'approccio filter-branch è molto più potente rispetto all'approccio rebase, dal momento che

  • consente di lavorare su tutti i rami/refs in una sola volta,
  • rinomina eventuali modifiche al volo
  • opera in modo pulito anche se ci sono stati diversi commit di unione dall'aggiunta del file
  • funziona in modo pulito anche se il file è stato (ri) aggiunto/rimosso più volte nella cronologia di (a) succursali
  • non crea nuovi commit non correlati, ma piuttosto li copia mentre modifica gli alberi ad essi associati. Ciò significa che roba come commit firmati, commettono note, ecc sono conservati

filter-branch mantiene i backup troppo, quindi la dimensione del pronti contro termine non diminuirà immediatamente a meno che non scadono i reflogs e spazzatura raccogliere:

rm -Rf .git/refs/original  # careful 
git gc --aggressive --prune=now # danger 
+1

Vale la pena notare che questo non sembra funzionare sotto windows cmd.exe. Sembra funzionare sotto cygwin bene, però. –

+1

Ho ottenuto il suddetto filtro-ramo git per funzionare usando doppie virgolette invece di virgolette singole (su Windows Server 2012 cmd.exe) – JCii

+0

Ciò che ha funzionato per me era questa riga di comando di filtro-diramazione. 'git filter-branch --force --index-filter 'git rm --ignore-unmatch --cached PathTo/MyFile/ToRemove.dll' - fbf28b005^..' Quindi 'rm --recursive - -force .git/refs/original' e 'rm --recursive --force .git/logs' Poi ho usato il' git prune --expire now' e 'gc git --aggressive' Questo ha funzionato meglio per me che i tuoi esatti passaggi elencati sopra. Grazie per aver incluso il link al libro di Git Pro in quanto prezioso. –

1

Sarà necessario git rebase in modalità interattiva vedere un esempio qui:? How can I remove a commit on GitHub? e how to remove old commits.

Se il commit è a livello di capi meno 10 commit:

$ git rebase -i HEAD~10 

Dopo l'edizione della vostra storia, è necessario spingere la "nuova" storia, è necessario aggiungere il + per forzare (vedere la refspec nel push options):

$ git push origin +master 

Se altre persone hanno già clonato il tuo repository, dovrai informarlo, perché hai appena cambiato la cronologia.

+3

Questo ** non ** rimuove il file di grandi dimensioni dalla cronologia. Inoltre, il modo canonico per forzare il push è 'git push --force' o' git push -f' (che non richiede che le persone conoscano il target push del ramo) – sehe

+0

In base alla domanda, il nuovo file è esattamente lo stesso come il vecchio file, cioè lo stesso percorso. Questo è il motivo per cui non è possibile utilizzare direttamente 'git rm' sul percorso. –

+2

@sehe, se si esegue una rebase eliminando il commit con l'enorme file, è andato per sempre. – vonbrand

Problemi correlati