2010-07-25 19 views
5

Artık GitHub'da diyet yapmak istediğim büyük çaplı, şişkin, Git deposu olan mucho disk alanı var. Projenin tarihinde, proje gidişatının güncel yönü ile alakasız olan eski eserlerin atılmasına ihtiyacım var.git rebase. Eski Komisyonların Reams'lerini Nasıl Kullanırım?

Bu özel repo'ların tek kullanıcısıyım - ve her zaman -.

git itibaren doğum-of-repo-dek-one aylık önce

Teşekkür rebase
Doug

+0

olası bir kopyası [Git deposunun ilk iki işlemini nasıl birleştiririm?] (Http://stackoverflow.com/questions/435646/how-do-i-combine-the-first-two-commits- of-a-git-repository) Burada bağlantılı soru sadece iki işi birleştirmeyi anlatırken, burada açıklanan tarifler daha fazla işlem için de işe yarar. –

+0

Teşekkürler Pavel. Kontrol edeceğim. – dugla

+0

Bu taahhütlerin tümünü tek bir işlemle mi yapmak istiyorsunuz yoksa aslında her birinin sunduğu değişiklikleri atmak mı istiyorsunuz? "Atmak" istediğin yorumlara göre ve proje farklı bir yöne gidiyor, bana tamamen açık değil. – masonk

cevap

2

Aslında, sıkıcı eski git rebase -i HEAD ~ Number ile başlayacağım, burada Number baştan başa inisiyasyona kadar yürüyecek. Daha fazla zaman harcıyor ama en azından ne yaptığına dair belirsiz bir anlayışa sahibim. Tüm önerileriniz için teşekkürler.

1

, Burada bir tarif olduğunu edecektir var:

gibi İdeal bir şey yapabileceğini Git 1.7.2 veya çalışmak yeni: onlar c beri

 
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 

, artık referans fazla iştir eski nesneleri dışarı temizlenmesi emin olduktan sonra reflogs vb zulası, etiketler, diğer dallar, tarafından işaret ould bu Aşağıdakilerden bir veya daha fazla yardımcı olmalı, sabit veya kaldırılır:

 
git prune 
git gc 
git repack -ad 
7

git merge için --squash seçenek olabilir faydalıdır ve git 1.4.1 ve sonraki sürümlerinde kullanılabilir. Bu, bir birleşmenin etkilerini aşamalıyor, ancak bir taahhüt oluşturmuyor.

# 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.) 

Şimdi git diff dcb7e5 new-master ile kontrol edebilirsiniz: 143eff Yani, eğer eski sen ezilmiş mevcut şube master ve taahhüt "önce bir ay" Yapabileceğin, dcb7e5 olduğunu taahhüt eklemek istediğiniz işlemek onlar gerçekten aynı.

Ardından, yeni-master üzerine işinizin kalanını rebase istiyorum:

$ git rebase --onto new-master dcb7e5 master 

istediğiniz geçmişi olmalıdır bir rebased master sizi terk edeceğimizi. . Github için ana iterken (Yine, git diff old-master master ve git log ile bu kontrol edebilirsiniz --force eklemeniz gerekecektir Eğer yeniden kaleme aldık beri geçmişi:

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

Artık kaldırabilir new-master, kabak taahhüt altındadır, ile:

git branch -d new-master 

Görünüşe github iter üzerinde git gc --auto çalışır, bu nedenle yakında tasarruf bazı boşluk görmelisiniz ...

+0

Bu bir çekicilik gibi çalıştı - teşekkürler Mark! – Itay

İlgili konular