2010-11-12 16 views
17

Moje repo jest SVN, a ja robię cały rozwój z git. Mamy standardowy układ, a ja zainicjowany mojego lokalnego repo z git svn init -s <url to repo>W jaki sposób git-svn wie, do której gałęzi należy dcommit?

Oto mój workflow do pracy z branż:

# creates a new branch remotely 
git svn branch new-branch-name 

# switches to a branch or trunk locally 
git reset --hard name-of-branch 
git reset --hard trunk 

# merge changes from trunk into a branch 
git reset —hard name-of-branch 
git merge trunk 
git svn dcommit 

To ostatnie polecenie powyżej będzie zatwierdzić zmiany nazwy-of-oddziału oddziału. Moje pytanie brzmi: jak git to wie? Kiedy robię git reset --hard foo, co dokładnie się dzieje?

To może sprowadzić się do ogólnego pytania na temat gita. Za każdym razem, gdy próbuję znaleźć odpowiedź, nie rozumiem, czy integracja svn jest szczególnym przypadkiem, czy nie.

Odpowiedz

11

git-svn będzie szukać drzewa zatwierdzeń dla przodków, które odpowiadają aktywnym gałęziom SVN (gałęzie refs/remotes/..., które odpowiadają gałęziom w SVN). Następnie dcommit do tych.

Pamiętaj, że nie powinieneś scalać, a następnie dcommit - SVN i Git's branching model nie pasują do siebie, a tego typu rzeczy mogą fubarować twoją historię SVN. Powinieneś zamiast tego git rebase trunk, gdy jesteś w oddziale. (Alternatywnie, git svn rebase.)

Pamiętaj też, że oddział, który wymeldujesz się przed uruchomieniem, powinien być oddziałem lokalnym. Jeśli tak nie jest, możesz utworzyć go przy pomocy git checkout -b local-branch-to-create remote-branch. Następnie git rebase trunk.

Jeśli chcesz zgnieść wszystkie zatwierdzenia, które zostały przejęte w jeden, wykonaj to po zbiorze: git reset --soft trunk && git commit.

Gdy jesteś zadowolony z zatwierdzeń, które teraz żyją na wierzchu, wystarczy git svn dcommit, aby przekazać je na serwer SVN.

+0

[1] "git-svn wyszuka drzewo zatwierdzeń dla zatwierdzeń przodków, które odpowiadają aktywnym gałęziom SVN, a następnie dcommit do tych." - Czasami się domyśla, że ​​coś jest nie tak - czy jest jakiś sposób, aby to sprecyzować? [2] "tego typu rzeczy mogą rozgryźć twoją historię SVN" - więc historia będzie niejednoczesna, ale scalanie plików kodu powinno być w porządku, tak? –

+0

hmm, strona man mówi, że '--commit-url' powinno być używane tylko do przełączania transportu, a" Używanie tej opcji do jakichkolwiek innych celów (nie pytaj) jest bardzo odradzane. " –

+0

Jeśli chcesz określić konkretną gałąź do zatwierdzenia, po prostu zmień gałąź swojej funkcji na górze odpowiedniej gałęzi zdalnej w repozytorium Git. – cdhowie

2

Czy to nie jest tak proste, jak utworzenie lokalnego oddziału i śledzenie zdalnego oddziału svn? Po wykonaniu polecenia git svn init --stdlayout url-of-svn-repo git usuwa całe repozytorium svn, kompresuje je tak, aby działało z git.

Po, że jest tylko kwestią faktu robi coś takiego:

git checkout -b mybranch -t remotes/mybranch 

Jeśli masz lokalny oddział śledzenia zdalnego oddziału, git svn dcommit popycha tylko do śledzonego zdalnej gałęzi.

+3

Próbowałem tego i 'git svn dcommit -n' nadal mówi, że będzie to zobowiązanie do bagażnika zamiast gałęzi, którą chcę –

+0

Nie jest to łatwe:" Git wymyśla, do której gałęzi twoje dcommits idą szukając wskazówek któregokolwiek z twoich oddziałów Subversion w twojej historii - powinieneś mieć tylko jedną i powinna być ostatnia z git-svn-id w twojej aktualnej historii oddziału. " https://git-scm.com/book/en/v2/Git-and-Other-Systems-Git-as-a-Client#switching-active-branches-LPtGtkszIW – jgomo3

1

prosty sposób, jeśli chcesz dcommit mistrza git svn w bagażniku, spróbuj wykonać następujące polecenia:

git checkout master 
git rebase trunk 
git svn info # To verify that you're on the right branch 
git svn dcommit 

samo, gdy na drugiej gałęzi (np 6.x)

git checkout 6.x 
git rebase 6.x # or git rebase remotes/6.x 
git svn info 
git svn dcommit 
Powiązane problemy