Come rimuovere le vecchie versioni dei file multimediali da un repository Git
-
28-10-2019 - |
Domanda
Ho un repository Git con diversi file multimediali enormi (immagini e file audio). Diverse versioni di questi file multimediali sono state successivamente impegnate nel repository. I file sono versioni successivamente raffinate delle stesse risorse e hanno lo stesso nome.
Voglio mantenere solo l'ultima versione nel repository Git, perché sta diventando troppo grande.
Qual è il modo più semplice per farlo?
Come posso propagare correttamente queste modifiche al repository a monte?
Soluzione
Ho una sceneggiatura (github gist qui) per rimuovere una selezione di cartelle indesiderate dall'intera storia di un Repo Git o per eliminare tutte le ultime versione di una cartella.
È duro supporre che tutti i repository Git siano ~/repos
, ma è facile cambiare. Dovrebbe anche essere facile adattarsi al lavoro con i singoli file.
Altri suggerimenti
Vecchio filo ma nel caso qualcun altro inciampa qui ...
Github e Bitbucket consigliano entrambi di usare BFG Repo-Cleaner.
Vedere:
GitHub: rimuovere i dati sensibili
Bitbucket: ridurre la dimensione del repository &
Bitbucket: mantenimento di un repository Git
Esempio per rimuovere i file oltre 1 megabyte, nonché JPG, PNG e MP3 che non sono in testa:
# First get the latest bfg.jar, then:
$ git clone --mirror git://example.com/some-big-repo.git
$ java -jar bfg.jar --strip-blobs-bigger-than 1M --delete-files '*.{jpg,png,mp3}' some-big-repo.git
$ cd some-big-repo.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
$ git push
Nota: ora hai spinto i giri aggiornati, il repository remoto dovrebbe anche eseguire git gc
... altrimenti non vedrai la riduzione delle dimensioni. (Vedi EG https://stackoverflow.com/a/28782154/3419541)
Infine, re-clone Il repository per essere sicuro di non impedire accidentalmente il vecchio file multimediale.
Controlla la sezione su "Rimozione di oggetti" nel capitolo Manutenzione e recupero dei dati Nel libro Progit. Fornisce passi su come fare la rimozione di oggetti dal Repo Git. Ma sii avvertito però che è distruttivo.
Come già accennato, qui riscriverai la storia, quindi dovrai fare collaboratori (se presenti) git rebase
.
Per quanto riguarda lo spogliare un determinato file dalla storia, GitHub ha una bella procedura dettagliata.
Per una soluzione in futuro, dovresti cercare di mettere i file binari in un sotto-modulo.
Il supporto del sottomodulo di Git consente a un repository di contenere, come sottodirectory, un checkout di un progetto esterno. I sottomoduli mantengono la propria identità; Il supporto del sottomodulo memorizza semplicemente la posizione del repository di sottomoduli e l'ID di commit, quindi altri sviluppatori che clonano il progetto contenente ("superproject") possono facilmente clonare tutti i sottomoduli alla stessa revisione. Sono possibili checkout parziali del SuperProject: puoi dire a Git di clonare nessuno, alcuni o tutti i sottomoduli.
Per quanto ne so, questo non può essere fatto, perché in Git, ogni commit dipende dal Contenuti del tutto Storia fino a quel punto. Quindi l'unico modo per sbarazzarsi dei vecchi e grandi file sarebbe quello di "riprodurre" l'intera storia di commit (preferibilmente con lo stesso timestamp e autori di commit), omettendo i grandi file. Si noti che ciò produrrà una storia di commit completamente separata.
Questo ovviamente non è un approccio molto praticabile, quindi la lezione è probabilmente "non usare Git per versione enormi file binari". Invece, potresti forse avere una cartella separata (ignorata) per i file e utilizzare un sistema separato per controllarli.