2009-05-25 21 views
27

Quiero acceder a un repositorio usando clientes GIT y SVN. Una manera que imaginé hacer eso es a través de la migración bidireccional automática: cuando un usuario PRESIONA en el repositorio GIT, también se COMPROMETE en el repositorio SVN y viceversa.¿Hay alguna manera de sincronizar repositorios GIT y Subversion?

¿Hay alguna herramienta que me ayude a hacer eso?

Respuesta

18

La mejor manera de hacerlo es usar git svn como cliente de Subversion. Esto proporciona una integración bidireccional entre un repositorio Subversion y un repositorio Git. Una vez que tenga un repositorio de Git, puede insertarlo en cualquier otro lugar para publicarlo.

Lo hago regularmente, en el trabajo hay un repositorio de Subversion que es el repositorio "maestro", y suelo usar git svn para acceder a él. A veces, si hago cosas que necesitan una funcionalidad de Subversion más específica, como la fusión, utilizaré el cliente normal svn contra el repositorio.

+12

Esto funciona para un solo usuario, pero no es suficiente para cualquiera que intente establecer un puente real entre dos repositorios para un equipo. Cualquier cambio hecho localmente en git será reaplicado por git svn rebase cada vez, y cualquier inserción de git subsiguiente en otro repositorio de git volverá a presionar los mismos cambios una y otra vez. –

1

Seguramente una manera más fácil de hacerlo sería tener el repositorio principal como Subversion, ¿pero usar git-svn localmente?

4

Puede considerar svn2git para importar fácilmente svn a git, y luego su aplicación de rubí de espejo git2svn.
Más detalles en this question.
Como se menciona en las otras respuestas, 'git svn' es obligatorio, pero esos módulos de rubí le ayudan a respetar el "directorio/ramas de subversión" sin tenerlos como un directorio real en Git.

2

que tienen un desnudo-GIT repositorios centrales del puente + SVN-GIT - un repos con svn git, el seguimiento de SVN en la rama 'actual' y el seguimiento de repositorio GIT en rama 'gitcentral'

Luego uso posterior a la actualización enganchar en repositorios centrales git así:

#!/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 

eso es en su mayoría temporales, pero funciona ...

12

Hay una nueva solución que realiza exactamente lo que quiere --- SubGit. Es concurrente-seguro (no puedo decir lo mismo sobre los scripts bash basados ​​en git-svn).

+0

Esto se ve muy prometedor, gracias. –

8

Nuestro equipo tenía exactamente el mismo problema y después de un poco de experimentación, logramos crear un puente Git-Subversion que sincroniza los cambios entre nuestro repositorio git de equipo y el repositorio corporativo de Subversion. Nuestro uso de git es transparente para otros usuarios de Subversion.

La configuración se describe con más detalle en https://github.com/mrts/git-svn-bridge.

Hemos utilizado esta configuración en producción durante más de un año.

Supongo que la mayor advertencia de la configuración es que el repositorio de git rastrea solo el tronco SVN (u otra rama individual), por lo que otras ramas de git serán aplastadas en una confirmación durante la fusión al tronco. Para nosotros esto no es ningún problema: utilizamos ramas de tareas efímeras y las consideramos "unidades de trabajo" livianas y efímeras que pueden ir a la línea principal en un solo fragmento, y el historial de ramas se conserva en git.

Cuestiones relacionadas