2009-10-28 23 views
20

Nasze repozytorium subversion jest nieco trudne: mamy podstawowy "domyślny" układ z bagażnikiem, tagami i oddziałami. Jednak w gałęziach mamy katalog "pracy", który zawiera więcej gałęzi. Coś takiego:Git-SVN z wieloma lokalizacjami oddziałów?

  • gałęzie/release_1_0_x
  • gałęzie/release_1_1_x
  • gałęzie/praca/Dave/topic_one
  • gałęzie/praca/tom/topic_two
  • gałęzie/praca/something_else

Teraz, jak mogę uzyskać git-svn, aby rozpoznać wszystkie (i kilka innych) jako oddzielne gałęzie? Wygląda na to, że git svn init akceptuje tylko jedną lokalizację oddziału, jakkolwiek ją przywołuję.

Edit: to jest jak ja zainicjowaniu repo git:

git svn clone -s --prefix=svn/ http://svn.company.com/product/ 

Odpowiedz

9

Zgodnie z odpowiedzią na another question, najlepiej jest użyć Git 1.6.x i skorzystać z "głębokim klonowanie".

Jeśli nie możesz dokonać aktualizacji do wersji 1.6.x, możesz określić wiele rozgałęzień podczas klonowania.

git svn clone -s --prefix=svn/ -b branches -b branches/work/dave -b branches/work/tom ... 

Musisz po prostu mieć pewność, dodać informacje dla nowych użytkowników do .git/config przed „git svn fetch” ing kiedy nowy oddział użytkownik został dodany.

+0

To jest rzeczywiście to, czego potrzebuję. dzięki za link! –

+4

co to powoduje, że twój plik .git/config wygląda, skoro używam git 1.7 i chciałbym zrobić to z mocą wsteczną? – whaley

+0

Próbowałem tego, ale ma również gałąź o nazwie "praca". Czy istnieje sposób, aby sprawić, by "praca" nie była jego własną gałęzią, ale że "work/something_else" jest? Prawdopodobnie z --ignore-paths? –

11

Dla tych, którzy chcą to zrobić z mocą wsteczną, git-svn manpage for 1.7.x mówi:

Jest również możliwe, aby pobrać podzbiór oddziałów lub tagów za pomocą oddzielonych przecinkami listę nazw ciągu szelkami. Na przykład:

[svn-remote "huge-project"] 
    url = http://server.org/svn 
    fetch = trunk/src:refs/remotes/trunk 
    branches = branches/{red,green}/src:refs/remotes/branches/* 
    tags = tags/{1.0,2.0}/src:refs/remotes/tags/* 
+0

Dzięki! W moim przypadku nie mogłem go sklonować w ten sposób, ale sklonowałem, edytowałem .git/config, aby dodać gałęzie na liście i ponownie "git svn fetch". Teraz 'git branch -a' lub' git branch -r' pokazuje gałęzie - woot! – sage

28

Możesz dodać wiele tagów oddziały i wpisy w git-svn config, nawet z mocą wsteczną. Więc jeśli normalnie gałęzie SVN żyć w branches/* w SVN repo (tj. Standardowy układ), ale masz również branches/summer-students/*, można go ustawić w .git/config jak poniżej:

[svn-remote "svn"] 
    url = svn+ssh://svn.example.com 
    fetch = trunk:refs/remotes/trunk 
    branches = branches/*:refs/remotes/* 
    tags = tags/*:refs/remotes/tags/* 

    branches = branches/summer-students/*:refs/remotes/svn-summer-students/* 

Na lewo od : jest ścieżkę w Repozytorium SVN, a po prawej - ścieżkę, która pojawi się na liście odległych gałęzi git. Możesz wielokrotnie używać refs/remotes/*, aby wszystko wyglądało jak odgałęzienie zdalne najwyższego poziomu, ale uważaj na kolizje nazw - będą one łamać rzeczy (stąd svn-summer-students zamiast summer-students, które już istnieją).

Po dokonaniu edycji konfiguracji należy usunąć .git/svn/.metadata i uruchomić git svn fetch, aby odświeżyć listę gałęzi i ją zregenerować. git branch -r powinien wtedy pokazać dodatkowe gałęzie. Jeśli pojawią się błędy, poszukaj nazw kolizji.

Kolejne przykłady określania ścieżek za pomocą symboli wieloznacznych lub wyrażeń można uzyskać, jeśli masz stylowy układ SVN.

+0

ratownik, który uratował mnie 4 dni po pobraniu! – prusswan

+0

Ładne wyjaśnienie, działa jak urok! –

Powiązane problemy