2009-05-25 11 views
27

Chcę uzyskać dostęp do repozytorium przy użyciu klientów GIT i SVN. Sposób, jaki sobie na to wyobraziłam, polega na automatycznej migracji dwukierunkowej: kiedy użytkownik PUSHuje do repozytorium GIT, jest on również ZOBOWIĄZANY w repozytorium SVN i odwrotnie.Istnieje sposób synchronizowania repozytoriów GIT i Subversion?

Czy jest jakieś narzędzie, które mogłoby mi w tym pomóc?

Odpowiedz

18

Najlepszym sposobem na to jest użycie git svn jako klienta Subversion. Zapewnia to dwukierunkową integrację między repozytorium Subversion i repozytorium Git. Gdy masz już repozytorium Git, możesz je wypchnąć gdziekolwiek indziej, aby je opublikować.

Robię to regularnie, w pracy istnieje repozytorium Subversion, które jest repozytorium "głównym" i zazwyczaj używam git svn, aby uzyskać do niego dostęp. Czasami, jeśli robię rzeczy, które wymagają bardziej specyficznej funkcjonalności Subversion, takiej jak scalanie, użyję zamiast tego zwykłego klienta svn.

+12

Działa to dla pojedynczego użytkownika, ale nie jest wystarczające dla każdego, kto próbuje ustanowić rzeczywisty most między dwoma repozytoriami dla zespołu. Wszelkie zmiany dokonane lokalnie w git będą ponownie stosowane przez git svn rebase za każdym razem, a każdy kolejny git push do innego repozytorium git będzie ponownie przesuwał te same zmiany w kółko. –

1

Z pewnością prostszym sposobem na to byłoby utrzymanie głównego repozytorium jako Subversion, ale używanie lokalnie git-svn?

4

Można rozważyć svn2git łatwe importowanie svn do git, a następnie jej zastosowanie rubin lustro git2svn.
Więcej szczegółów w this question.
Jak wspomniano w innych odpowiedziach, "git svn" jest obowiązkowa, ale te moduły ruby ​​pomagają respektować "gałęzie/katalog subversion", nie mając ich jako rzeczywistego katalogu w Git.

2

mam gołe git centralne repo + SVN-git Bridge - do repo z Git SVN śledzenia SVN w oddział 'prąd' i śledzenie repozytorium GIT w oddział 'gitcentral'

Następnie używam post-aktualizacji hak w centralnym repo git tak:

#!/bin/bash 

# Anything inserted into GIT - move it back to SVN 

echo 
echo '* Pushing data into SVN branch' 
cd /home/git/BRIDGE 
unset GIT_DIR 

# current - svn branch locally and central git branch on project.git repos 
# centralgit - unmodified centralgit branch 
git fetch /home/git/repositories/project.git/ master:centralgit || (echo "Error while pulling data into bridge repository"; exit 1) 
git checkout -b temp centralgit || exit 2 
git rebase current || exit 3 
git checkout current || exit 4 
git reset --hard temp || exit 5 
git svn dcommit || exit 6 
git branch -D temp || exit 7 

echo '* Pushed correctly data into SVN' 
exit 0 

to głównie skroniowej, ale działa ...

12

Jest to nowe rozwiązanie, które wykonuje dokładnie to, co chcesz --- SubGit. Jest współbieżny (nie mogę powiedzieć tego samego o skryptach Bash opartych na git-svn).

+0

To wygląda bardzo obiecująco, dziękuję. –

8

Nasz zespół miał dokładnie ten sam problem i po kilku eksperymentach udało nam się wymyślić mostek git-Subversion, który synchronizuje zmiany między naszym repozytorium git zespołu a korporacyjnym repozytorium Subversion. Nasze użycie git jest przejrzyste dla innych użytkowników Subversion.

Konfiguracja została opisana bardziej szczegółowo pod numerem https://github.com/mrts/git-svn-bridge.

Użyliśmy tej konfiguracji w produkcji przez ponad rok.

Domyślam się, że największym zastrzeżeniem konfiguracji jest to, że repozytorium git śledzi tylko pendrive SVN (lub inną pojedynczą gałąź), w ten sposób inne gałęzie git będą przycinane do jednego zatwierdzenia podczas scalania do pnia. Nie stanowi to dla nas problemu - używamy krótkotrwałych gałęzi zadaniowych i uważamy je za lekkie, efemeryczne "jednostki pracy", które mogą przejść do linii głównej w jednym kawałku - a historia gałęzi jest zachowana w git.

Powiązane problemy