2011-12-22 15 views
22

Quindi sto migrando da svn (code.google.com) a git (github).Come riassegnare tutti i commit dall'inizio

Ho importato il mio progetto dal repository svn e ha importato tutta la cronologia del commit lungo la strada. Non sono davvero orgoglioso di quei commenti in quanto è stato uno dei miei primi progetti, non molto serio.

Vorrei rebase tutto in un unico commit di "importazione iniziale".

Ho tirato tutto sul mio computer e sto cercando di farlo. Ma tutto quello che ho trovato è stato: git rebase -i master ma si limita a modificare le nuove modifiche e si impegna.

Come posso pulire il mio repository github da tutta la cronologia con un rebase?

risposta

16

È possibile rebase e schiacciare tutto se si desidera (tranne il commit iniziale) ma perché preoccuparsi? Basta eliminare la directory .git, eseguire git init per ricrearlo, git add tutto e git commit per eseguire un nuovo commit iniziale.

+0

In realtà - la tua è una risposta migliore per il solo raggruppamento di un singolo commit. Lascerò il mio solo per mostrare che è possibile specificare un commit da cui iniziare il rebasing. – Abizern

+0

sì, ho finito con questa soluzione. Ringrazia tutti. –

2

Se vuoi per ridurre tutta la vostra storia per un singolo "importazione iniziale" commit, è sufficiente rimuovere .git directory e creare un nuovo repository locale (tenere un backup di quello vecchio). git init . && git add . && git commit -m "Initial import".

Tale nuovo repository non avrà un antenato comune con quello che hai inviato a GitHub, quindi dovrai disporre di git push --force il tuo repository appena creato.

5

Trova l'hash del commit da cui si desidera iniziare lo squash, ad esempio abcd12, quindi rebase in modo specifico contro quell'hash.

git rebase -i abcd12 

Si utilizza master a rebase contro, che svolge il rebase contro la punta del ramo master.

+0

ha funzionato per la cronologia, ma il messaggio accanto a ogni file mostra ancora il messaggio di commit di prima. –

+0

In realtà hai schiacciato i file? offre un'opzione per creare un nuovo messaggio di commit. – Abizern

+0

Sì, ho fatto lo squash di tutto tranne il primo commit. Ho rimosso tutti i messaggi di commit. Lo stavo vedendo bene nella cronologia dei github, ma non sui singoli file. Forse era un problema con la cache di github. Comunque grazie, ho finito per inizializzare un nuovo repository. –

9

risposta di Jefromi funzionerà, ma se si vuole mantenere la configurazione repo esistente, o anche lasciare in giro i commit nel caso in cui, si potrebbe procedere come segue:

git checkout master

git branch backup lasciare eventualmente un altro ramo qui nel caso in cui vuoi mantenere la tua storia.

git reset --soft $SHA_OF_INIT_COMMIT questo aggiornerà ciò che HEAD sta puntando ma lascerà l'indice e la directory di lavoro nel loro stato corrente. È possibile ottenere lo SHA con git log --pretty=format:%h --reverse | head -n 1 e fare questo passo con git reset --soft $(git log --pretty=format:%h --reverse | head -n 1)

git commit --amend cambiare il commit iniziale in modo che punti allo stato corrente del repository.

35

git rebase -i --root avvia un rebase interattivo di tutti i commit dall'inizio.

Da lì, è possibile schiacciare tutti i commit in uno e/o eseguire altre modifiche.

Problemi correlati