2009-08-12 25 views
12

Słyszałem, że możliwe jest posiadanie lokalnego repozytorium Git na komputerze programisty, przy zachowaniu głównej kopii kodu źródłowego przechowywanego w repozytorium svn.Użyj lokalnego repozytorium Git z głównym repozytorium Subversion

Dobrym przykładem użycia byłoby posiadanie centralnego repozytorium svn, z którym pracuje każdy programista. Jeden programista jest czasami offline i chce śledzić zmiany, które robi w trybie offline. Gdy programista jest z powrotem online i ma dostęp do svn, modyfikacje jego kopii roboczych można sprawdzić w svn. Nie mam nic przeciwko utracie historii zmian, które miały miejsce lokalnie w Git, kiedy pliki są sprawdzane w svn.

Czy ktoś może pokazać, jak najlepiej to zrobić? Czy są jakieś pułapki do pracy w ten sposób?

Odpowiedz

4

Jako punkt wyjścia można użyć czegoś takiego jak this tutorial. Czytałem również this tutorial.

Istnieje kilka pułapek w tym trybie pracy. Najważniejszym z nich jest to, że nie możesz używać svn wersji 1.5 mergeinfo i oczekiwać, że przetrwa to poprzez git. Jest to poważną wadą, jeśli używasz (prawdopodobnie dość przyzwoitej) funkcji scalania svn 1.5.

Strona podręcznika dla użytkownika git-svn zawiera także uwagi dotyczące "zastrzeżeń", które należy zrozumieć. Kiedy zrozumiałem wszystkie zastrzeżenia, zrozumiałem, że korzyści wynikające z używania tej konfiguracji są niższe niż faktyczne koszty w moim konkretnym przypadku. Użyłem więc moją energię, aby przekonać do projektu, aby przełączyć do git zamiast coś Właśnie succeded w

1

Myślę, że lepszym rozwiązaniem jest git-svn, jeśli jesteś zmuszony do pracy z centralnym repozytorium svn, ale chciałbyś osobiście pracować z git. A może większość osób w zespole czuje się teraz bardziej komfortowo w pracy z svn. Używając git-svn nie stracisz historii commitów wykonanych w lokalnym repozytorium git.

Jeśli konfigurujesz nowe repozytorium od podstaw i/lub masz swobodę wyboru, wybrałbym jedną lub drugą. git-svn działa dobrze, ale zawsze będziesz walczył z "błędem dopasowania impedancji" pomiędzy dwoma systemami.

Jeśli jest to po prostu scentralizowany model, który chcesz zaimplementować, wówczas publiczne repozytorium git może być używane jako centralne repozytorium. Patrz sekcja podręcznika użytkownika Git pod numerem setting up a shared repository.

2

Jedno rozwiązanie chciałbym spróbować to:.

  1. Zamówienie z centralnym repo za pomocą SVN
  2. git init tworzyć lokalne repo
  3. dodać .svn do .gitignore
  4. git add *, aby dodać wszystkie pliki do lokalnego repo
  5. wykonywać wszystkie twe gałęzie pośrednie/zobowiązuje się/powraca w git.
  6. Gdy skończysz, wróć do centralnego repozytorium za pomocą SVN.
4

Wypowiedz SVN repo jest svn + ssh: // nazwa_użytkownika @ svn_server/svn/your_repo
i repozytorium SVN ma "właściwego" układ (pień, gałęzie, znaczniki) Oto workflow I używam już od kilku miesięcy:
1.'mkdir your_repo'
2. 'cd your_repo'
3. "git svn klona -s svn + ssh: // nazwa_użytkownika @ svn_server/svn/your_repo. "(myśl kropka)
4. [poczekać jakiś czas w zależności od wielkości repozytorium :)]
teraz swoją GIT«mistrz»śledzi tułowia SVN
Można także oddział śledzenia jak wy mieliście normalnie zrobić z git jeśli pracujesz na jakiejś gałęzi
5. tradycyjny siekać siekać siekać
6. aktualizacji twój klon z 'git svn pobrać & & git svn rebase'
7. "push" twoje zmiany na svn z 'git svn dcommit '

Więcej dobrych rzeczy
Zdefiniuj następujące przydatne aliasy w swojej .gitconfig:
1. Alias ​​spull ' która stoi na SVN-pull tak:'! spull = git svn pobrania & & git svn rebase '
2. Alias' spush 'co oznacza svn-push tak:'! spush = git svn dcommit '
te aliasy włączyć obieg w czystej efektywności: klon/siekać siekać/spull/spush ->zysk

svn: externals
nie mogłem znaleźć dobre rozwiązanie do tego w Internecie, więc zrobiłem je sobie :)
http://github.com/sushdm/git_svn_externals to jeszcze nie jest doskonałe, ale powinno zdecydowanie ułatwić życie.

Działa dla mnie doskonale, mam nadzieję, że ci to pomoże.

Powiązane problemy