2010-07-25 17 views
5

Ora ho un grosso deposito di Git, che suona gonfiore e git che consuma molto spazio su GitHub che voglio mettere a dieta. Ho bisogno di scartare i vecchi commit fatti all'inizio della storia del progetto che sono sostanzialmente irrilevanti rispetto alla direzione attuale del progetto.git rebase. Come faccio a utilizzarlo per comprimere i flussi di antichi commit

Sono - e sarò sempre - l'unico utente di questo repo privato.

Idealmente avrei potuto fare qualcosa di simile:

git rebase dalla nascita-di-repo-fino-un-mese-fa

Grazie,
Doug

+0

possibile duplicato di [Come combinare i primi due commit di un repository Git?] (Http://stackoverflow.com/questions/435646/how-do-i-combine-the-first-two-commits- of-a-git-repository) Mentre la domanda collegata qui parla di combinare solo due commit, le ricette descritte funzionano anche per ulteriori commit. –

+0

Grazie Pavel. Lo guarderò. – dugla

+0

Vuoi schiacciare tutti quei commit in un commit, o vuoi davvero scartare le modifiche che sono state introdotte? Sulla base dei tuoi commenti che vuoi "scartare" e il progetto sta andando in una direzione diversa, non è del tutto chiaro per me. – masonk

risposta

2

In realtà, andrò con noioso vecchio git rebase -i HEAD ~ Number dove Number mi riporterà dalla testa al commit iniziale. Più tempo ma almeno ho una vaga comprensione di ciò che sta facendo. Grazie per tutti i suggerimenti.

1

Ecco una ricetta che vi lavorare in Git 1.7.2 o successivi:

 
start=$starting_sha1 
git checkout --orphan new_master $start 
git commit -m 'new root' 
git rebase --onto new_master $start master 
git checkout master 
git reset --hard new_master 
git push -f origin master 

Ripulire i vecchi oggetti che nessun riferimento è più più lavoro, dal momento che c ould essere puntato da reflogs, Stash, tag, altri rami, ecc Una volta che siete sicuri questi sono fissati o rimossi, uno o più dei seguenti dovrebbe aiutare:

 
git prune 
git gc 
git repack -ad 
7

L'opzione --squash-git merge potrebbe essere utile ed è disponibile in git 1.4.1 e successive. Questo mette in scena gli effetti di un'unione, ma non crea un commit. Quindi, se 143eff è la più antica commit che si desidera includere nel schiacciato commit, la filiale corrente è master e il "solo un mese fa" commit è dcb7e5, si potrebbe fare:

# Save the old position of "master" by creating a branch old-master: 
$ git checkout master 
$ git branch old-master 

# Create and checkout a branch called "new-master" that's at the old commit: 
$ git checkout -b new-master 143eff 

# Stage the effects of merging the "one month ago" commit: 
$ git merge --squash dcb7e5 
Updating 143eff3..dcb7e5b 
Fast-forward 
Squash commit -- not updating HEAD 
[... status output showing the staged changes ..] 

# Create the squashed commit: 
$ git commit -m "A commit squashing history up to a month ago" 
# (You could use --amend if you want them to be squashed into 143eff 
# instead of being a commit after that.) 

Ora è possibile controllare con git diff dcb7e5 new-master che sono davvero gli stessi.

Avanti, si vuole rebase il resto del tuo lavoro sulla nuova-master:

$ git rebase --onto new-master dcb7e5 master 

che vi lascerà un ricalcolato master che dovrebbe avere la storia che si desidera. la storia (in questo caso, è possibile controllare questo con git diff old-master master e git log Quando si spinge master per GitHub è necessario aggiungere --force visto che hai riscritto:.

# Push master to github, with "--force", since you've rewritten history: 
$ git push --force origin master 

È ora possibile rimuovere new-master, che è alla zucca commettere, con:

git branch -d new-master 

Apparentemente github corre git gc --auto su spinte, così si dovrebbe vedere un po 'di salvaspazio presto ...

+0

Questo ha funzionato come un fascino - grazie Mark! – Itay

Problemi correlati