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?

È stato utile?

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.

https://git-scm.com/docs/git-submodule

https://git-scm.com/book/en/v2/git-tools-submodules

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top