2010-07-25 10 views
5

Mam teraz duże, nadęte, rozdęte, repozytorium Git zużywające dużo miejsca na dysku na GitHub, które chcę wprowadzić na dietę. Muszę odrzucić starożytne zobowiązania popełnione na początku historii projektu, które są zasadniczo nieistotne dla obecnego kierunku, w którym zmierza projekt.git rebase. Jak używać tego, aby zwinąć relikty dawnych zobowiązań

Jestem - i zawsze będę - jedynym użytkownikiem tego prywatnego repozytorium.

Idealnie mógłby zrobić coś takiego:

git rebase z-narodziny-of-repo-aż-jednomiesięczna-temu

Dzięki,
Doug

+0

możliwy duplikat [Jak połączyć pierwsze dwa zatwierdzenia repozytorium Git?] (Http://stackoverflow.com/questions/435646/how-do-i-combine-the-first-two-commits- of-a-git-repository) Podczas gdy pytanie tutaj powiązane mówi o połączeniu tylko dwóch commitów, opisane tam receptury działają również dla większej ilości zatwierdzeń. –

+0

Dzięki Pavel. Sprawdzę to. – dugla

+0

Czy chcesz zmiażdżyć wszystkie te zatwierdzenia w jeden commit, czy rzeczywiście chcesz odrzucić zmiany, które każdy z nich wprowadził? Na podstawie twoich komentarzy, które chcesz "odrzucić", a projekt zmierza w innym kierunku, nie jest dla mnie całkowicie jasne. – masonk

Odpowiedz

2

Właściwie pójdę z nudnym starym git rebase -i HEAD ~ Number, gdzie Number odejdzie mi od głowy do zatwierdzenia inital. Bardziej czasochłonne, ale przynajmniej mam niejasne pojęcie o tym, co robi. Dzięki za wszystkie sugestie.

1

Oto przepis, który będzie praca w Git 1.7.2 lub nowszym:

 
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 

Czyszczenie starych obiektów, których już nie odwołujesz, to więcej pracy, ponieważ one ould być wskazywany przez reflogs, zapas, znaczniki innych gałęzi itp Gdy jesteś pewien, są one stałe lub usunięte, jeden lub więcej z następujących czynności powinno pomóc:

 
git prune 
git gc 
git repack -ad 
7

Opcja git merge--squash może być przydatne i jest dostępne w git 1.4.1 i nowszych. W ten sposób powstaje efekt scalenia, ale nie tworzy się zatwierdzenia. Tak więc, jeśli 143eff jest najstarszym popełnić chcesz dołączyć w zgnieciony popełnić, aktualna gałąź jest master i „miesiąc temu” popełnić jest dcb7e5, można zrobić:

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

Teraz można sprawdzić z git diff dcb7e5 new-master że oni naprawdę są tacy sami.

Następnie chcesz rebase resztę pracy na nowym-master:

$ git rebase --onto new-master dcb7e5 master 

To zostawię cię na rebased master który powinien mieć historię chcesz. . (Ponownie, można to sprawdzić z git diff old-master master i git log Kiedy naciska kapitanowi GitHub trzeba będzie dodać --force odkąd przepisany historia:

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

Teraz można usunąć new-master, który znajduje się na squash popełnienia, z:

git branch -d new-master 

Widocznie github biegnie git gc --auto na pchnięć, więc powinieneś zobaczyć trochę oszczędność miejsca wkrótce ...

+0

To działało jak czar - dzięki Markowi! – Itay