2009-01-21 23 views
144

¿Hay alguna manera de agregar un repositorio de Subversion como un submódulo de Git en mi repositorio de Git?¿Es posible tener un repositorio de Subversion como submódulo de Git?

Algo así como:

git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project 

Dónde https://svn.foo.com/svn/proj apunta a un repositorio de Subversion.

Sé que hay git-svn que le permite a uno interactuar con un repositorio de Subversion. Así que estoy pensando, tal vez haya una manera de verificar un repositorio de Subversion con git-svn y luego usarlo como un submódulo.

Respuesta

121

No. Su mejor opción sería configurar un espejo del repositorio svn en un repositorio dedicado de git.

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

continuación, puede agregar el repositorio git como un sub-módulo al proyecto original

cd /path/to/gitproject 
git submodule add git://example.com/project.git -- svn-project 
git add svn-project 
git commit -m "Add submodule" 

Hay una diferencia conceptual entre svn: externos y submódulo git que pueden hacerte tropezar si se acercan a esto desde un punto de vista de subversión. El submódulo git está vinculado a la revisión que le das. Si "corriente arriba" cambia, entonces debe actualizar la referencia de su submódulo.

Así que cuando vuelve a sincronizar con la subversión contra la corriente:

cd /path/to/mysvnclone 
git svn rebase 
git push 

... el proyecto Git seguirá utilizando la revisión original que hemos cometido antes. Para actualizar a la cabeza SVN, que tendría que utilizar

cd /path/to/gitproject/svn-project 
git checkout master 
git pull 
cd .. 
git add svn-project 
git commit -m"Update submodule" 
+1

¿Has probado estos códigos antes de publicarlos aquí? los submódulos no pueden funcionar correctamente en git svn. – xhan

+3

@xhan sí, y no estoy abogando por mezclar git-svn y submódulos en el mismo repositorio. El clon que usa git-svn es solo un puente para crear un clon git nativo del repositorio svn. – richq

+0

lo siento. No te he encontrado utilizando dos carpetas para actuar como submódulos. buen truco. – xhan

0

pistón está siendo reescrito para apoyar esto, y lo contrario, además de la URL Subversion existente en un repoistory Subvresion y GIT + git.

Echa un vistazo the piston Github repository.

Desafortunadamente, no parece haber sido lanzado.

+3

Piston fallará en su cara cuando más lo necesite;), entonces no lo recomiendo. Además, ya no hay correcciones de errores para el pistón. – Henrik

7

Acabo de pasar por esto. Estoy haciendo algo similar a rq, pero ligeramente diferente. Configuré uno de mis servidores para alojar estos clones de git de los repos svn que necesito. En mi caso, solo quiero versiones de solo lectura y necesito un repositorio simple en el servidor.

En el servidor que ejecuta:

GIT_DIR=<projectname>.git git init 
cd <projectname>.git/ 
GIT_DIR=. git svn init svn://example.com/trunk 
GIT_DIR=. git svn fetch 
git gc 

Esto configura mi repo desnudo, entonces tengo un script cron para actualizarlo:

#!/usr/bin/python 

import os, glob 

GIT_HOME='/var/www/git' 

os.chdir(GIT_HOME) 
os.environ['GIT_DIR']='.' 
gits = glob.glob('*.git') 
for git in gits: 
    if not os.path.isdir(git): 
    continue 
    os.chdir(os.path.join(GIT_HOME, git)) 
    if not os.path.isdir('svn/git-svn'): 
    #Not a git-svn repo 
    continue 

    #Pull in svn updates 
    os.system('git svn fetch && git gc --quiet') 
    #fix-svn-refs.sh makes all the svn branches/tags pullable 
    os.system('fix-svn-refs.sh') 
    #Update the master branch 
    os.system('git fetch . +svn/git-svn:master && git gc --quiet')` 

Esto también requiere fijar-REF-subversion. SH a partir de http://www.shatow.net/fix-svn-refs.sh Esto fue inspirada principalmente por: http://gsocblog.jsharpe.net/archives/12

no estoy seguro de por qué el git gc que se necesita aquí, pero yo no estaba capaz de hacer un git pull sin él.

Entonces, después de todo esto, puede usar el submódulo git siguiendo las instrucciones de rq.

+0

Uno podría pensar que incluso podría hacer esto como un commit hook. –

4

Además de lo que se dijo, otro método sería utilizar el proyecto externo "external" (http://nopugs.com/ext-tutorial), que imita mejor cómo funcionan las referencias externas svn. Con externalidades puede rastrear los repositorios de git o svn, y parece más fácil enviar sus cambios en sentido ascendente a esos repositorios. Sin embargo, requiere que los miembros del proyecto descarguen e instalen el paquete por separado.

No he usado submódulos o externos todavía; sin embargo, he dedicado algunas horas a leer sobre todas las alternativas y parece que las externas se adaptarán mejor a mis necesidades. Existe una excelente discusión sobre estos y otros métodos personalizados en el Capítulo 15 de "Version Control with Git", de Jon Loeliger (http://oreilly.com/catalog/9780596520120), que recomiendo encarecidamente.

5

Actualmente git-svn no soporta svn: externos. Pero hay otras dos herramientas que pueden ayudarle a:

  1. SubGit

    SubGit es la solución del lado del servidor, que permite el acceso a Git depósito de la subversión y viceversa. Puede hacer referencia a documenation para más detalles, pero en general es bastante fácil de usar SubGit:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO 
    

    Por encima de comando detectará ramas de disposición en el proyecto de SVN y luego creará vacío repositorio Git desnuda lista para reflejar proyecto SVN . Es posible que se le pidan credenciales, a menos que ya estén almacenadas en el caché de credenciales SVN en el directorio ~/.subversion. También puede ajustar $GIT_REPO/subgit/authors.txt para asignar nombres de autor SVN a las identidades de Git.

    $ subgit install $GIT_REPO 
    $ ... let initial translation complete ... 
    $ TRANSLATION SUCCESSFUL 
    

    En este momento en que tienen depósito de la subversión conectado al repositorio Git de nueva creación. SubGit traduce la revisión SVN en Git commit en cada svn commit y Git se compromete en la revisión SVN en cada git push.

Todo lo que necesita además es hacer que el repositorio Git esté disponible para los committers. Eche un vistazo a git-http-backend para eso. Luego puede agregar el repositorio de Git creado como un submódulo habitual. SubGit también está disponible como un complemento para el servidor Bitbucket, para obtener más información, visite here. Por lo tanto, no es necesario utilizar ninguna herramienta externa como git-svn o cualquier otra.

SubGit es un software propietario, pero es gratuito para pequeñas empresas (hasta 10 committers), proyectos académicos y de código abierto.

  1. SmartGit

    SmartGit reemplaza git-svn en el lado del cliente. Más información sobre sus características puede encontrar here.

    En particular SmartGit hace apoyar tanto submódulos git y svn: externos, se les puede mezclar en su repositorio.

    SmartGit es un software propietario, pero es gratuito para uso no comercial.

0

Bueno, hay git-remote-testsvn, así que supongo que algo así como

git submodule add testsvn::http://www.telegraphics.com.au/svn/bzquips/trunk/ \ 
    module/bzquips 

debería funcionar. ¿Lo hace?

Cuestiones relacionadas