2009-09-11 16 views

Odpowiedz

18
git rebase remotes/trunk --interactive 

powinien zabrać Cię do menu, w którym możesz wybrać commit lub zgnieść je wszystkie w 1 commit, aby uniknąć zanieczyszczenia twojego repozytorium svn. This to naprawdę dobry (ale krótki) zasób dotyczący pracy z git-svn.

+0

Wydaje się to jak bardzo dobre rozwiązanie. Nie rozumiem, jaki jest wpływ pilota/pnia w poleceniu, a wynikiem końcowym jest to, że wszystkie moje commashed zostały zmiażdżone wewnątrz mistrza. Miałem nadzieję, że zostaną zgnieceni tylko przy wysyłaniu do SVN. Konieczne jest zatwierdzenie SVN po wykonaniu zgniatania. –

+0

@MacRae Linton: Wszystkie twoje zobowiązania muszą zostać zgniecione w mistrzu. Gdyby nie git, nie mieliby możliwości zsynchronizowania repozytoriów git i svn. Kiedy przebijesz się, by wyciągnąć najnowsze zmiany, svn miałoby jeden commit, ale w git miałbyś n commitów. –

+0

@Jason Punyon: Kwestia, na którą napotykam, polega na tym, że po zmiażdżeniu popełnianym przez mistrza staje się trudne ponowne połączenie mistrza z moją rozwijającą się gałęzią. Prawie wszystkie moje zmiany stają się konfliktami seryjnymi, z którymi trzeba sobie poradzić. Czy jest to nieuniknioną konsekwencją oddzielenia mojej rozwijającej się gałęzi od zmiażdżonego pana? –

17

Nie, ale można łatwo zgnieść wszystkie poprawki. Na poniższym przykładzie, mam zamiar założyć, jesteś w branży master odpowiadającej zdalnego trunk gałęzi i że chcesz squish wszystkie lokalne zobowiązuje razem:

git tag local # create a temporary tag 
git reset --hard trunk 
git merge --squash local 
git commit # write your single commit message here 
git svn dcommit 
git tag -d local # delete the temporary tag named local 

Zamiast tymczasowego tag mogłeś również po prostu użyć reflog (tj użyć [email protected]{1} zamiast local)

+0

to jest całkowicie fajne, to całkowicie zmienia mój przepływ pracy, wielkie dzięki –

3

Kiedy pracuję z git-svn i chcę serii zatwierdzeń git, które pojawiają się jako pojedyncze zatwierdzenia, pracuję nad gałęzią tematów, a następnie wykonuję niekodowane szybkie przekształcenie merge w master przed dcommit -ing.

pierwsze, zmieniają bazę swój oddział przeciwko svn i upewnij się, miejscowy mistrz jest up-to-date:

git svn rebase && git push . remotes/trunk:master 

Następnie przełączyć do opanowania, scalania i dcommit:

git checkout master 
git merge <branch> --no-ff -m "Message you want in svn" 
git svn dcommit 

To pokaże się jako pojedyncze zatwierdzenie w Subversion, ale nadal będziesz mieć swoją lokalną historię, która doprowadziła cię do tego zatwierdzenia.

         +--- Merge commit 
             V 
svn trunk *---*---*-------------------*--- --- --- 
        \    /
topic branch   *---*---*---*---* 
3

Prostszym sposobem mogłoby być (jeśli masz kilka zobowiązuje spiętrzone w systemie lokalnym):

git reset <hash tag of commit till which u need to combine> 
git commit -am "your message" // This will create one clubbed commit of all the commit till the hash tag used. 
+2

Upewnij się, że dodajesz nowe pliki. "git commit -am" nie dodaje nowych plików samodzielnie. –

+0

Alternatywnie, przy użyciu opcji reset --soft pozostawi zmiany wszystkie etapami, dzięki czemu nie musisz się martwić o dodawanie plików lub używanie -a. – PeterJCLaw

0

że nie pracuje dla mnie. Używam merge --no-ff --no-commit ale po popełnić, mam:

svntrunk      54f35e4 [trunk: ahead 336] release 1 

dcommitting do trunkwill popełnić wszystkie 336 zobowiązuje.

resetowanie, oznaczanie i zgniatanie, jak opisano w odpowiedzi # 2: Combine local Git commits into one commit for git-svn będzie działać, ale przy następnym "scaleniu" będziesz miał kłopot, aby ponownie zebrać wszystkie poprawki!

jedynym, który pracuje dla mnie:

git checkout -tb svntrunk remotes/trunk 
git merge --no-commit --squash master 

uzyskać wszystkie zobowiązuje od mistrza do svn bez utraty historia dla przyszłości połączenia z tego samego polecenia

~ Marcel

Powiązane problemy