2009-02-22 16 views
13

Sembra che il mio impegno iniziale stia mangiando il 90% dello spazio, dato che è stato accidentalmente creato con un bel po 'di file multimediali. C'è un modo per rimuovere solo il primo commit da repository locali e remoti, o dovrei semplicemente lasciare questo essere?Posso rimuovere il commit iniziale da un repository Git?

+1

Esiste anche 'git rebase --root'. Per i dettagli vedere la seguente risposta SO per i dettagli: http://stackoverflow.com/questions/2246208/change-first-commit-of-project-with-git – MKroehnert

risposta

20

Sembra che tu abbia già condiviso il repository con un numero di altri utenti. Se questo è il caso, probabilmente dovresti semplicemente conviverci.

Se si ha il controllo di tutti i cloni, è possibile riscrivere la cronologia su un commit radice modificato con i file non desiderati rimossi. Nota che non dovresti farlo se altri sviluppatori hanno già lavorato su questo ramo.

Se si è interessati alla riscrittura della cronologia, è possibile provare quanto segue. Si noti che poiché git mantiene i registri di dove è stato recentemente eseguito il commit HEAD (reflog), gli oggetti di grandi dimensioni non scompariranno immediatamente dal repository o da altri repository che li hanno già, anche se si tenta di git gc o git gc --prune. Tuttavia, garantirà che eventuali nuovi cloni non finiranno per il recupero degli oggetti di grandi dimensioni come parte della cronologia del ramo principale.

Supponendo che la directory di lavoro è 'pulito':

# Go back the initial commit 
git checkout <SHA1_of_old_root> 

# Clean up the index to remove unwanted files, e.g. using git rm <files> 
# ... 

# Amend the initial commit with the new tree. Note the sha1 of the new commit 
git commit --amend 

# Go back to the master branch 
git checkout master 

# Re-apply all the commits onto the new root 
git rebase --onto <SHA1_of_new_root> <SHA1_of_old_root> 
2

In alternativa è possibile utilizzare per rimuovere git filter-branch offendere file (vedere la sezione esempi), ma è anche riscrivere la storia. Quindi chiunque abbia basato il proprio codice in cima alla propria vecchia cronologia subirebbe una cattiva sorpresa ...

+1

il filtro-ramo gestirà anche meglio (o almeno richiederà meno interazione) se le modifiche ai file indesiderati sono state tracciate dal commit della radice. –

Problemi correlati