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?
risposta
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
Vale la pena notare che questo non sembra funzionare sotto windows cmd.exe. Sembra funzionare sotto cygwin bene, però. –
Ho ottenuto il suddetto filtro-ramo git per funzionare usando doppie virgolette invece di virgolette singole (su Windows Server 2012 cmd.exe) – JCii
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. –
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.
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
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. –
@sehe, se si esegue una rebase eliminando il commit con l'enorme file, è andato per sempre. – vonbrand
È possibile utilizzare lo strumento git-extras. Il comando obliterate rimuove completamente un file dal repository, compresi commit e tag precedenti.
- 1. Rimuovere tutti i file per git commit?
- 2. git: rimuovere 2nd commit
- 3. Come rimuovere temporaneamente l'ultimo commit con Git?
- 4. rimuovere un referenziata commit dalla repository git
- 5. Come rimuovere i file cancellati da .git?
- 6. Rimuovi file dal commit modificato
- 7. Come rimuovere i file dal repository GitHub?
- 8. Posso rimuovere il commit iniziale da un repository Git?
- 9. Dopo git rm file; commit - come recuperare il file dal ramo remoto?
- 10. Git: rimuovere le credenziali dal repository
- 11. Rimuovere i file dal master su github
- 12. Come rimuovere la cartella eliminata dal repository remoto in Git?
- 13. Come rimuovere l'origine dal repository git
- 14. Come ottenere l'ennesimo commit dal primo commit?
- 15. git commit comment per file
- 16. git commit symlink come file normale
- 17. Come git commit un singolo file/cartella
- 18. Rimuovere completamente un file dall'intero repository git
- 19. git commit -m vs. git commit -am
- 20. (git): come portare un commit specifico dal ramo upstream?
- 21. GIT annulla un commit che non è il più recente, rebase tutti i commit dal
- 22. Come si cerca il contenuto storico del file mercurial?
- 23. Come vedi quale commit ha cancellato un file dal repository?
- 24. rimuovere dal file
- 25. Come posso rimuovere i commit separati da git?
- 26. Rimuovere del tutto un changeset specifico dal repository Git?
- 27. Come impedire il commit successivo su file specifici su git?
- 28. Git: come clonare il primo commit?
- 29. git posso accelerare il commit?
- 30. Il conteggio dei commit dal tag
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
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) –