Effettua il fork e sincronizza il repository Google Code Subversion in GitHub


131

Come posso eseguire il fork e rimanere sincronizzato con un repository Subversion di codice Google a cui non ho accesso in scrittura, in un repository GitHub?

Voglio essere in grado di sviluppare le mie funzionalità nel mio repository Git, ma voglio anche sincronizzarmi con il repository Google Code Subversion. Per recuperare le correzioni dal lato del progetto Codice Google.

Conosco git-svn e l'ho usato prima per up e downstream verso un repository Subversion su cui avevo il pieno controllo. Ma non so come rimanere sincronizzato con un repository Subversion di codice di Google.

Risposte:


178

Il ramo remoto di git-svn è praticamente lo stesso di un normale telecomando Git. Quindi nel tuo repository locale puoi avere il tuo clone git-svn e inviare le modifiche a GitHub. A Git non importa. Se crei il tuo clone git-svn e invii esattamente le stesse modifiche a GitHub, avrai un mirror non ufficiale del repository Google Code. Il resto è vaniglia Git.

git svn clone http://example.googlecode.com/svn -s
git remote add origin git@github.com:example/example.git
git push origin master

Ora che hai questo, a volte dovrai sincronizzare il repository Subversion con Git. Sarà simile a:

git svn rebase
git push

In gitk o altro, questo sarebbe simile a questo:

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

E quando corri git svn rebase, avresti questo:

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

Quindi ora correndo git pushsi spingerebbe fuori il commit di GitHub, il ramo [telecomandi / origine / master] lì. E torneresti allo scenario nel primo diagramma di arte ASCII.

Il problema ora è: come si modificano le modifiche nel mix? L'idea è che non ti impegni mai nello stesso ramo in cui stai git-svn-rebase-ing e git-push. È necessario un ramo separato per le modifiche. Altrimenti, finiresti per riorganizzare le tue modifiche in aggiunta a quelle di Subversion, il che potrebbe sconvolgere chiunque cloni il tuo repository Git. Seguimi? OK, quindi crei un ramo, chiamiamolo "caratteristiche". E fai un commit e lo invii a GitHub nel ramo delle funzionalità. Il tuo gitk sarebbe simile a questo:

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

Qui hai un ramo delle tue funzioni un paio di commit prima del ramo di Google Code, giusto? Quindi cosa succede quando desideri incorporare nuovi elementi da Google Code? Dovresti correre per git svn rebaseprimo e ottenere questo:

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

Se sei git pushesperto, puoi immaginare che [telecomandi / origine / master] si trovano nello stesso punto del master. Ma la sezione delle funzionalità non presenta le modifiche. Le tue scelte ora sono di fondere il master in funzionalità o di modificare le funzionalità. Una fusione sarebbe simile a questa

git checkout features
git merge master 

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

Quindi invii le funzionalità a GitHub. Ho lasciato i telecomandi per master per risparmiare spazio, sarebbero allo stesso punto di [master] .

L'approccio rebase è leggermente più malvagio - dovresti spingere con - forza poiché la tua spinta non sarebbe una fusione rapida (tireresti il ​​ramo delle caratteristiche da sotto qualcuno che lo aveva clonato). Non è davvero corretto fare questo, ma nessuno può fermarti se sei determinato. Rende anche alcune cose più facili, come quando le patch vengono accettate a monte in forma leggermente rielaborata. Eviterebbe di dover fare confusione con i conflitti, puoi semplicemente riformulare - salta le patch a monte. Ad ogni modo, un rebase sarebbe così:

git rebase master features

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

E poi dovresti farlo git push --force. Puoi capire perché devi forzarlo, la storia ha un grande vecchio scisma dai [telecomandi / origine / caratteristiche] alla nuova attuale post-rebase [caratteristiche] .

Tutto funziona, ma è un grande sforzo. Se hai intenzione di contribuire regolarmente, la soluzione migliore sarebbe quella di lavorare in questo modo per un po ', inviare alcune patch a monte e vedere se riesci a ottenere l'accesso commit a Subversion. In caso contrario, forse non inviare le modifiche a GitHub. Mantienili locali e cerca comunque di farli accettare a monte.


Grazie per le eccellenti istruzioni. ( gitNoob qui.) Domanda veloce. Ho fatto questo contro un grande repository SVN ed è uscito a ~ 141 megabyte. L'ho spinto su github e poi l'ho clonato di nuovo in basso, ed è uscito a 130 megabyte. Ho corso git gcsu entrambi. Cosa potrebbe spiegare la differenza?
mpontillo,

... capito. Avevo bisogno git push origin --mirror.
mpontillo,

Ha funzionato come un incantesimo, ora devo solo dire agli sviluppatori googlecode originali di usare github con me: D
electblake

Questo non ha funzionato per me con l' -sopzione per git svn clone, ma senza di esso il resto ha funzionato bene.
user1027169

15

servizio svn2github

Il sito Web http://svn2github.com/ fornisce un servizio per trasferire qualsiasi repository SVN accessibile al pubblico su Github (all'indirizzo https://github.com/svn2github/projectname ). L'ho provato; premendo "Crea uno specchio" apparentemente non ha fatto nulla per alcuni secondi e ha visualizzato il messaggio "errore", ma in realtà ha funzionato. È stato infatti creato il nuovo repository, contenente il codice dal repository SVN.

Dovresti quindi fork il repository che crea e lavorare sul tuo fork. Invieresti quindi le tue modifiche al progetto upstream usando il loro bugtracker.

Osservando i repository esistenti nell'utente Github del servizio (ad es. "Svn2github inviato al master su svn2github / haxe 5 ore fa"), sembra che esegua regolarmente il pull delle modifiche dal repository SVN. Non ci sono informazioni su chi gestisce il servizio sul sito Web, quindi non scommetterei sul fatto che continui a funzionare a tempo indeterminato, ma funziona per ora (e se mai scende, puoi comunque aggiornare manualmente il tuo fork).

Trampolino di lancio

Se non hai intenzione di usare Git e Github, un'altra alternativa è usare Launchpad.net. Launchpad può importare automaticamente i repository SVN (anche CVS) in un ramo bzr personale. Per fare ciò, crea un progetto Launchpad, quindi vai alla nuova pagina di importazione , seleziona Subversion e inserisci l'URL (ad es http://projectname.googlecode.com/svn/trunk/.). A seconda delle dimensioni del progetto, l'importazione iniziale può richiedere alcune ore. Le importazioni successive verranno eseguite periodicamente.

Per ulteriori documentazione, vedere Importazioni VCS nella Guida di Launchpad .


10

Una guida per la sincronizzazione da Google Code a GitHub è disponibile su fnokd.com . L'autore utilizza un server remoto sempre attivo e un processo cron per automatizzare la sincronizzazione e mantiene il trunk SVN in un ramo GitHub chiamato "vendor".



1

Hmm .. Nella mia compagnia stavo facendo quasi lo stesso. Avere entrambi i repository .svn e .git nella stessa directory (si controlla repository svn e si crea repository git in questa copia di lavoro).

Quindi usare svn up e git push ha fatto la cosa. Ovviamente se divergi molto dovrai unire le cose a mano.


Sì, ma voglio evitare di avere i metadati .svn e speravo che git fosse in grado di usare un
repository

Quindi non è possibile usare git-svn per controllare il repository e git push su github?
Marcin Gil,

0

Non sono sicuro di cosa tu voglia, ma, naturalmente, puoi estrarre da un repository di sovversione e spingere in un repository Git dalla stessa copia di lavoro. E puoi anche git svn dcommittornare al repository di sovversione. Tuttavia, non è possibile sincronizzare il repository GitHub con il repository subversion. Inoltre, quando nella copia di lavoro sono presenti commit che non si trovano ancora nel repository di sovversione, sarà necessario modificarli se il repository di sovversione è stato aggiornato, costringendoti ai git push --force"nuovi" commit su GitHub.


0

Ho trovato queste istruzioni sul blog di Yu-Jie Lin :

Prima clonare il repository Subversion e passare a Git:

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo
git remote add git-foo git@github.com:username/foo.git 
git push git-foo master

Dopo aver eseguito il commit nel repository Subversion, eseguire

cd /path/to/git-foo
git svn fetch 
git svn rebase 
git push git-foo master
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.