2009-04-28 11 views
131

¿Cómo puedo bifurcarme y mantenerme sincronizado con un repositorio de Google Code Subversion al que no tengo acceso de escritura en un repositorio de GitHub?Tenedor y sincronizar el repositorio de Google Subversion de código en GitHub

Quiero ser capaz de desarrollar mis propias características en mi repositorio de Git, pero también quiero sincronizar con el repositorio de Google Code Subversion. Para buscar soluciones desde el lado del proyecto de Google Code.

Sé acerca de git-svn y lo he usado antes para subir y bajar a un repositorio de Subversion del que yo tenía control total. Pero no sé cómo mantenerme sincronizado con un repositorio de Google Code Subversion.

Respuesta

178

La rama remota de git-svn es prácticamente la misma que la de un control remoto regular de Git. Entonces en su repositorio local puede tener su clon git-svn y enviar cambios a GitHub. A Git no le importa Si crea su clon git-svn y envía exactamente los mismos cambios a GitHub, tendrá un espejo no oficial del repositorio de Google Code. El resto es Vanilla Git.

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

Ahora que tiene esto, ocasionalmente tendrá que sincronizar el repositorio de Subversion con Git. Se verá algo como:

git svn rebase 
git push 

En gitk o lo que sea, esto sería algo como esto:

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

Y cuando se ejecuta git svn rebase, que tendría esto:

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

Así que ahora ejecutando git push empujará esos commits a GitHub, la rama [remotes/origin/master] allí. Y volverás al escenario en el primer diagrama de arte ASCII.

El problema ahora es, ¿cómo trabajas tus cambios en la mezcla? La idea es que nunca te comprometas con la misma rama que eres git-svn-rebase-ing y git-pushing. Necesita una sucursal separada para sus cambios. De lo contrario, terminarías redefiniendo tus cambios sobre los de Subversion, lo que podría molestar a cualquiera que clone tu repositorio de Git. ¿Sígueme? De acuerdo, entonces crea una rama, llamémosla "características". Y haces una confirmación y la envías a GitHub a la rama de características. Su gitk sería algo como esto:

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

Aquí tienes tu sucursal cuenta con un par de confirmaciones por delante de la rama de Google Code, ¿verdad? Entonces, ¿qué sucede cuando quieres incorporar cosas nuevas de Google Code? Que había corrido git svn rebase primera y obtener esto:

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

Si git push master out, se puede imaginar el [mandos a distancia/origin/master] estar en el mismo punto que amo. Pero su rama de características no tiene los cambios. Sus opciones ahora son fusionar el maestro en características o funciones de rebase.Una fusión se vería así

git checkout features 
git merge master 

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

Luego, presiona las funciones en GitHub. He dejado los controles remotos para que el maestro ahorre espacio, estarían en el mismo punto que [maestro].

El enfoque de rebase es un poco más maligno - tendrías que presionar con --force ya que tu empujón no sería una fusión de avance rápido (sacarías la rama de funciones de debajo de alguien que la había clonado). Realmente no se considera correcto hacer esto, pero nadie puede impedirte si estás decidido. También facilita algunas cosas, como cuando los parches son aceptados en sentido ascendente en una forma ligeramente retrabajada. Ahorraría tener que lidiar con conflictos, simplemente puede rebase - omita los parches ascendentes. De todos modos, un rebase sería así:

git rebase master features 

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

Y entonces tendría que git push --force eso. Puede ver por qué necesita forzarlo, la historia tiene un gran cisma antiguo del [controles remotos/características/características] a la nueva posreposición actual [características].

Todo esto funciona, pero es un gran esfuerzo. Si vas a ser un colaborador habitual, la mejor opción sería trabajar así durante un tiempo, enviar algunos parches de subida y ver si puedes obtener acceso de confirmación a Subversion. De lo contrario, quizás no envíe sus cambios a GitHub. Manténgalos locales e intente que sean aceptados aguas arriba de todos modos.

+0

Gracias por las excelentes instrucciones. ('git' noob aquí.) Pregunta rápida. Hice esto contra un gran repositorio SVN y salió a ~ 141 megabytes. Lo empujé a github y luego lo cloné de nuevo, y salió a 130 megabytes. Ejecuté 'git gc' en ambos. ¿Qué podría explicar la diferencia? – mpontillo

+0

... lo descubrí. Necesitaba 'git push origin --mirror'. – mpontillo

+0

Funcionó como un amuleto, ahora solo necesito decirle a los desarrolladores originales de googlecode que usen github conmigo: D – electblake

1

Hmm .. En mi compañía estaba haciendo casi lo mismo. Solo tengo ambos .svn y .git repo en el mismo directorio (se puede sacar svn repo y crear git repo en esta copia de trabajo).

Luego usar svn up y git push hizo lo mismo. Por supuesto, si diverges mucho tendrás que fusionar cosas a mano.

+0

A la derecha, pero quiero evitar tener los metadatos .svn y esperaba que git pueda usar un repositorio svn como master de flujo descendente – optixx

+0

Entonces, ¿no es posible? para usar git-svn para pagar el reintegro y git push para github? –

0

No estoy muy seguro de qué es lo que quiere, pero, por supuesto, puede extraer de un repositorio de subversión y enviarlo a un repositorio de Git desde la misma copia de trabajo. Y también puede git svn dcommit volver al repositorio de subversión. Sin embargo, no puedes hacer la sincronización del repositorio de GitHub contra el repositorio de subversión. Además, cuando tiene confirmaciones en su copia de trabajo que todavía no están en el repositorio de subversión, tendrá que volver a establecer una base de ellas si el repositorio de subversión se actualizó, lo que le obliga a git push --force. El "nuevo" se compromete con GitHub.

10

Un recorrido para sincronizar desde Google Code a GitHub está disponible en fnokd.com. El autor utiliza un servidor remoto siempre activo y un trabajo cron para automatizar la sincronización y mantiene el tronco SVN en una rama de GitHub llamada "proveedor".

2

GitHub ahora admite la importación directa de proyectos de subversión (consulte http://help.github.com/import-from-subversion/). Simplemente cree un nuevo repositorio y luego haga clic en "Importar desde Subversión" en la pantalla "Pasos siguientes". Sin embargo, no admite más sincronización: /.

+0

Este método ya no existe – magnetik

+0

Use https://import.github.com/new ahora en su lugar. Consulte https://help.github.com/articles/importing-from-subversion/. –

15

servicio svn2github

La página web http://svn2github.com/ ofrece un servicio a la mesa cualquier repositorio SVN de acceso público en Github (en https://github.com/svn2github/projectname). Lo intenté; al presionar "Hacer un espejo", aparentemente no hizo nada durante unos segundos y mostró el mensaje "error", pero realmente funcionó. El nuevo repositorio fue de hecho creado, conteniendo el código del repositorio SVN.

Luego bifurcaría el repositorio que crea y trabajaría en su propio tenedor. A continuación, envíe sus cambios al proyecto original utilizando su rastreador de errores.

Al mirar los repositorios existentes bajo el usuario de Github del servicio (por ejemplo, "svn2github empujado a dominar en svn2github/haxe hace 5 horas"), parece que regularmente realiza cambios desde el repositorio SVN. No hay información sobre quién ejecuta el servicio en el sitio web, por lo que no apostaría a que continúe ejecutándose indefinidamente, pero funciona por ahora (y si alguna vez falla, puede actualizar manualmente su fork).

Launchpad

Si usted no está configurado en el uso de Git y Github, otra alternativa es utilizar Launchpad.net. Launchpad puede importar automáticamente repositorios SVN (también CVS) en una rama bzr personal. Para ello, cree un proyecto Launchpad, luego vaya a the new import page, seleccione Subversion e ingrese la URL (por ejemplo, http://projectname.googlecode.com/svn/trunk/). Según el tamaño del proyecto, la importación inicial puede demorar algunas horas. Las importaciones posteriores se ejecutarán periódicamente.

Para obtener más documentación, vea VCS Imports on Launchpad Help.

0

me encontré con estas instrucciones en Yu-Jie Lin 's blog:

primer clon del depósito de la subversión y empujar a la 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 

Después de cometer en el repositorio de Subversion, ejecute

cd /path/to/git-foo 
git svn fetch 
git svn rebase 
git push git-foo master 
Cuestiones relacionadas