Fork i synchronizacja repozytorium Google Code Subversion na GitHub

Jak mogę forkować i synchronizować z repozytorium Google Code Subversion, do którego nie mam dostępu do zapisu, do repozytorium GitHub?

Chcę mieć możliwość tworzenia własnych funkcji w repozytorium Git, ale chcę również synchronizować się z repozytorium Google Code Subversion. Aby pobrać poprawki od strony projektu Google Code.

Wiem o git-svn i używałem go wcześniej do up-and downstream do repozytorium Subversion, nad którym miałem pełną kontrolę. Ale nie wiem jak zachować w synchronizacji z repozytorium Google Code Subversion.

 131
Author: darkomen, 2009-04-28

7 answers

Zdalna gałąź z git-svn jest prawie taka sama jak zwykły Git remote. Więc w lokalnym repozytorium możesz mieć swój klon git-svn i wypychać zmiany na GitHub. Git ma to gdzieś. Jeśli utworzysz swój klon git-svn i wypchniesz te same zmiany na GitHub, będziesz miał nieoficjalne lustro repozytorium kodu Google. Reszta to waniliowy Git.

git svn clone http://example.googlecode.com/svn -s
git remote add origin [email protected]:example/example.git
git push origin master

Teraz, gdy masz to, od czasu do czasu będziesz musiał zsynchronizować repozytorium Subversion z Gitem. Będzie wygląda jak:

git svn rebase
git push

W gitku czy jakoś tak to by wyglądało mniej więcej tak:

o [master][remotes/trunk][remotes/origin/master]
|
o
|
o

A kiedy biegniesz git svn rebase, będziesz miał to:

o [master][remotes/trunk]
|
o
|
o [remotes/origin/master]
|
o
|
o

Więc teraz uruchomiony git push wypchnie te commity do Githuba, gałęzi [remotes/origin/master] . I wróciłbyś do scenariusza na pierwszym diagramie sztuki ASCII.

Problem polega na tym, jak pracujesz nad zmianami w miksie? Chodzi o to, że nigdy nie angażujesz się w tę samą gałąź że jesteś git-svn-rebase-ing i GIT-pushing. Potrzebujesz oddzielnej gałęzi dla swoich zmian. W przeciwnym razie zmienisz swoje zmiany na Subversion, co może zdenerwować każdego, kto sklonuje Twoje repozytorium Git. Za mną? OK, więc tworzysz gałąź, nazwijmy ją "features". Tworzysz commit i wypychasz go na GitHub do gałęzi features. Twój gitk wyglądałby mniej więcej tak:

o [features][remotes/origin/features]
|
o
|
o [master][remotes/trunk][remotes/origin/master]
|
o

Tutaj masz swoje funkcje gałąź kilka commitów przed oddział Google Code, tak? Co się dzieje, gdy chcesz włączyć nowe rzeczy z Google Code? Najpierw biegniesz git svn rebase i dostaniesz to:

                           o [features][remotes/origin/features]
[master][remotes/trunk] o  |
                        |  o
                        o /
                        |/
                        o[remotes/origin/master]
                        |
                        o

Jeśli git push opanujesz, możesz sobie wyobrazić, że [piloty/origin/master] jest w tym samym punkcie co master. Ale twoja gałąź funkcji nie ma zmian. Teraz możesz połączyć master Z FUNKCJAMI lub rebase. Połączenie wyglądałoby tak:

git checkout features
git merge master 

            o [features]
           /|
          / o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

Następnie wypychasz funkcje na GitHub. Skończyłem. piloty dla master aby zaoszczędzić miejsce, byłyby w tym samym punkcie co [master] .

Podejście rebase jest nieco bardziej złe - musiałbyś naciskać z --force, ponieważ twoje naciśnięcie nie byłoby fast-forward merge (wyciągniesz gałąź funkcji spod kogoś, kto ją sklonował). To nie jest naprawdę uważane za OK, aby to zrobić, ale nikt nie może cię powstrzymać, jeśli jesteś zdeterminowany. Ułatwia to również pewne rzeczy, na przykład, gdy łaty są akceptowane w nieco przerobionej formie. On oszczędź sobie bałaganu z konfliktami, możesz po prostu rebase-pominąć upstreamed patches. W każdym razie rebase byłby taki:

git rebase master features

         o [features]
         |
         o
         |  o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

I wtedy musiałbyś git push --force to. Możesz zobaczyć, dlaczego musisz go wymusić, historia ma dużą starą schizmę z [piloty / pochodzenie/funkcje] do nowego obecnego Post-rebase [funkcje] .

To wszystko działa, ale to dużo wysiłku. Jeśli masz zamiar być stałym współpracownikiem, najlepiej będzie pracować w ten sposób przez jakiś czas, wyślij kilka łatek pod prąd i sprawdź, czy możesz uzyskać dostęp do commitów do Subversion. Jeśli tego nie zrobisz, może nie wypychaj swoich zmian na GitHub. Utrzymuj je na miejscu i postaraj się je zaakceptować pod prąd.

 178
Author: richq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-18 21:20:06

Svn2github service

Strona internetowa http://svn2github.com/ udostępnia usługę forkowania dowolnego publicznie dostępnego repozytorium SVN na Github (at https://github.com/svn2github/projectname ). próbowałem; po naciśnięciu "Make a mirror" widocznie nic nie robił przez kilka sekund i wyświetlał komunikat "error" , ale faktycznie działał. W rzeczywistości powstało nowe repozytorium, zawierające kod z repo SVN.

Następnie rozwidlasz repozytorium tworzy i pracuje na własnym widelcu. Następnie możesz przesłać swoje zmiany do projektu upstream, używając ich bugtrackera.

Patrząc na istniejące repozytoria pod adresem użytkownika usługi Github (np. "svn2github pushed to master at svn2github / haxe 5 hours ago"), wydaje się, że regularnie pobiera zmiany z repozytorium SVN. Nie ma informacji o tym, kto prowadzi serwis na stronie, więc nie postawiłbym na to, że będzie działał w nieskończoność, ale na razie działa (i jeśli kiedyś padnie, nadal można ręcznie zaktualizować widelec).

Launchpad

Jeśli nie używasz Gita i Githuba, inną alternatywą jest użycie Launchpad.net. Launchpad może automatycznie importować repozytoria SVN (również CVS) do osobistej gałęzi bzr. Aby to zrobić, utwórz projekt Launchpad, a następnie przejdź do nowej strony importu , Wybierz Subversion i wprowadź adres URL (np. http://projectname.googlecode.com/svn/trunk/). W zależności od wielkości projektu początkowy import może potrwać do kilku godzin. Kolejne importy będą realizowane okresowo.

Aby uzyskać więcej informacji, zobacz Import VCS w Pomocy Launchpad .

 15
Author: Mechanical snail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-14 22:42:57

Przejście do synchronizacji z Google Code na GitHub jest dostępne pod adresem fnokd.com . autor używa zawsze włączonego zdalnego serwera i Zadania cron do automatyzacji synchronizacji i utrzymuje trunk SVN w gałęzi GitHub o nazwie "vendor".

 10
Author: akaihola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-01 10:39:59

GitHub obsługuje teraz bezpośredni import projektów subversion (zobacz http://help.github.com/import-from-subversion / ). po prostu utwórz nowy repo, a następnie kliknij "Importuj z Subversion" na ekranie "Następne kroki". Nie obsługuje jednak dalszej synchronizacji :/.

 2
Author: nick black,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-14 08:50:57

Hmm.. W mojej firmie robiłem prawie to samo. Mam jedno i drugie .svn i .git repo w tym samym katalogu (kasujesz svn repo i tworzysz git repo w tej roboczej kopii).

Następnie używając svn up i git push zrobił to. Oczywiście, jeśli dużo się rozdzielisz, będziesz musiał połączyć rzeczy ręcznie.

 1
Author: Marcin Gil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-28 09:43:12

Nie jestem do końca pewien, czego chcesz, ale oczywiście możesz wyciągnąć z repozytorium subversion i wypchnąć do repozytorium Git z tej samej kopii roboczej. Możesz także git svn dcommit wrócić do repozytorium subversion. Nie można jednak synchronizować repozytorium GitHub z repozytorium subversion. Ponadto, jeśli masz commity w swojej kopii roboczej, które nie znajdują się jeszcze w repozytorium subversion, będziesz musiał je zmienić, jeśli repozytorium subversion zostało zaktualizowane, zmuszając cię do git push --force "nowy" zobowiązuje się do GitHub.

 0
Author: Bombe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-28 12:01:59

Znalazłem te instrukcje na Yu-Jie Lin's blog:

Najpierw Sklonuj repozytorium Subversion i wypchnij do Git:

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo
git remote add git-foo [email protected]:username/foo.git 
git push git-foo master

Po zatwierdzeniu w repozytorium Subversion Uruchom

cd /path/to/git-foo
git svn fetch 
git svn rebase 
git push git-foo master
 0
Author: Ellen Spertus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-29 21:43:22