2009-04-28 12 views
131

In che modo è possibile eseguire il fork e mantenere la sincronizzazione con un repository di Subversion di codice Google a cui non si dispone dell'accesso in scrittura, in un repository GitHub?Forcella e sincronizzazione del repository di Google Code Subversion in GitHub

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

Conosco git-svn e l'ho usato prima su e giù per un repository Subversion su cui avevo il pieno controllo. Ma non so come mantenere la sincronizzazione con un repository di Google Subversion.

risposta

178

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

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

Ora che si dispone di questo, di tanto in tanto sarà necessario sincronizzare il repository Subversion con Git. Sarà simile a:

git svn rebase 
git push 

In gitk o qualsiasi altra cosa, questo sarebbe simile a questa:

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

E quando si esegue git svn rebase, si dovrebbe avere questo:

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

Quindi, con lo git push, è possibile inviare tali commit a GitHub, il ramo [remotes/origin/master]. E torneresti allo scenario nel primo diagramma artistico ASCII.

Il problema ora è: come lavori le tue modifiche nel mix? L'idea è che non ti impegni mai nello stesso ramo in cui sei git-svn-rebase-ing e git-push. Hai bisogno di un ramo separato per le tue modifiche. Altrimenti, finirai per ridefinire le tue modifiche in cima a quelle di Subversion, cosa che potrebbe sconvolgere chiunque cloni il tuo repository Git. Seguimi? OK, quindi crei un ramo, chiamiamolo "caratteristiche". E fai un commit e spingilo a GitHub verso il ramo delle funzionalità. Il tuo gitk sarebbe simile a questa:

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

Qui hai la tua Branch include un paio di impegna in vista della filiale Google Code, giusto? Quindi cosa succede quando vuoi incorporare nuove cose da Google Code? Faresti esegue git svn rebase prima e ottenere questo:

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

Se git push padrone fuori, si può immaginare l'[telecomandi/origin/master] essendo allo stesso punto come master. Ma il tuo ramo di funzionalità non ha le modifiche. Ora le tue scelte sono di unire il master in feature o rebase feature.Una fusione sarebbe simile a questa

git checkout features 
git merge master 

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

Poi spingere caratteristiche fuori a GitHub. Ho lasciato fuori i telecomandi per il master per risparmiare spazio, sarebbero nello stesso punto di [master].

L'approccio di rebase è leggermente più malvagio - dovresti spingere con forza perché la tua spinta non sarebbe un'unione di avanzamento rapido (dovresti estrarre il ramo di funzionalità da qualcuno che lo ha clonato). Non è davvero considerato OK farlo, ma nessuno può fermarti se sei determinato. Rende anche alcune cose più semplici, come quando le patch vengono accettate a monte in forma leggermente rielaborata. Risparmierebbe con i conflitti, si può semplicemente rebase --skip le patch upstreamed. In ogni caso, un rebase sarebbe come questo:

git rebase master features 

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

E poi si dovrebbe git push --force questo. Puoi vedere perché hai bisogno di forzarlo, la storia ha un grande vecchio scisma dal [remotes/origine/caratteristiche] al nuovo attuale postbase [caratteristiche].

Tutto questo funziona, ma è un grande sforzo. Se si vuole essere un contributore normale, la soluzione migliore sarebbe quella di lavorare in questo modo per un po ', inviare alcune patch upstream e vedere se è possibile ottenere l'accesso di commit a Subversion. In caso contrario, forse non inviare le tue modifiche a GitHub. Tienili locali e prova a farli accettare a monte comunque.

+0

Grazie per le eccellenti istruzioni. ('git' noob qui.) Domanda veloce. Ho fatto questo contro un grande repo SVN ed è uscito a ~ 141 megabyte. L'ho spinto a github e poi lo ho clonato indietro, ed è uscito a 130 megabyte. Ho eseguito 'git gc' su entrambi. Cosa potrebbe spiegare la differenza? – mpontillo

+0

... capito. Mi serviva 'git push origin --mirror'. – mpontillo

+0

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

1

Hmm .. Nella mia azienda stavo facendo quasi lo stesso. Basta avere entrambi .svn e .git repository nella stessa directory (checkout svn repo e creare git repo in questa copia funzionante).

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

+0

Sì, ma voglio evitare di avere i metadati .svn e spero che git sia in grado di usare un repository svn come master downstream – optixx

+0

Quindi non è possibile usare git-svn per il checkout repo e git push su github? –

0

Non sono sicuro di cosa vogliate ma, naturalmente, potete prelevare da un repository di subversion e inviare a un repository Git dalla stessa copia di lavoro. E puoi anche git svn dcommit tornare al repository subversion. Tuttavia, non è possibile sincronizzare il repository GitHub con il repository di subversion. Inoltre, quando nella copia di lavoro sono stati effettuati commit che non sono ancora presenti nel repository di subversion, sarà necessario rebase se il repository di subversion è stato aggiornato, forzando a git push --force il "nuovo" commit a GitHub.

10

Un passaggio per la sincronizzazione da Google Code a GitHub è disponibile allo 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 "fornitore".

2

GitHub ora supporta direttamente l'importazione di progetti di sovversione (vedere http://help.github.com/import-from-subversion/). Basta creare un nuovo repository e quindi fare clic su "Importa da Subversion" nella schermata "Passaggi successivi". Tuttavia, non supporta ulteriori sincronizzazioni: /.

+0

Questo metodo non esiste più – magnetik

+0

Utilizzare invece https://import.github.com/new ora. Vedi https://help.github.com/articles/importing-from-subversion/. –

15

servizio svn2github

Il sito http://svn2github.com/ fornisce un servizio a sborsare qualsiasi repository SVN pubblicamente accessibile su Github (a https://github.com/svn2github/projectname). L'ho provato; premendo su "Make a mirror" apparentemente non ha fatto nulla per pochi secondi e ha visualizzato il messaggio "errore", ma in realtà ha funzionato. Il nuovo repository è stato infatti creato, contenente il codice dal repository SVN.

Si quindi biforcare il repository che crea e lavorare sulla propria forcella. Dovresti quindi inviare le tue modifiche al progetto upstream usando il loro bugtracker.

Guardando i repository esistenti sotto l'utente Github del servizio (ad esempio "svn2github inviato a master a svn2github/haxe 5 ore fa"), sembra che le modifiche vengano regolarmente apportate dal repository SVN. Non ci sono informazioni su chi gestisce il servizio sul sito web, quindi non scommetterei sul fatto che continui a girare a tempo indeterminato, ma per ora funziona (e se dovesse mai andare giù, puoi comunque aggiornare manualmente la tua forcella).

Launchpad

Se non si sta insieme sull'utilizzo di Git e GitHub, un'altra alternativa è di 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 a the new import page, seleziona Subversion e inserisci l'URL (ad esempio http://projectname.googlecode.com/svn/trunk/). A seconda della dimensione del progetto, l'importazione iniziale può richiedere alcune ore. Le importazioni successive verranno eseguite periodicamente.

Per ulteriori documentazione, vedere VCS Imports on Launchpad Help.

0

ho trovato queste istruzioni sul blog Yu-Jie Lin s':

primo clone del repository Subversion e spingere al 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 

Dopo aver commesso nel repository Subversion, eseguire

cd /path/to/git-foo 
git svn fetch 
git svn rebase 
git push git-foo master 
Problemi correlati