¿Es posible tener un repositorio Subversion como un submódulo Git?

154

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

Algo como:

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

Donde https://svn.foo.com/svn/projapunta a un repositorio de Subversion.

Sé que existe lo git-svnque permite interactuar con un repositorio de Subversion. Así que estoy pensando, tal vez hay una manera de verificar un repositorio de Subversion git-svny luego usarlo como un submódulo.

davitenio
fuente

Respuestas:

127

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

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

Luego puede agregar el repositorio git como un submó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 puede hacer que te tropieces si abordas esto desde un punto de vista de subversión. El submódulo git está vinculado a la revisión que le das. Si "upstream" cambia, entonces debe actualizar la referencia de su submódulo.

Entonces, cuando volvemos a sincronizar con la subversión ascendente:

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

... el proyecto git seguirá utilizando la revisión original que comprometimos anteriormente. Para actualizar al svn HEAD, deberías usar

cd /path/to/gitproject/svn-project
git checkout master
git pull
cd ..
git add svn-project
git commit -m"Update submodule"
richq
fuente
1
¿Has probado estos códigos antes de publicarlo aquí? Los submódulos no pueden funcionar correctamente en git svn.
xhan
44
@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
lo siento. No te he encontrado usando dos carpetas para actuar como submódulos. buen truco.
xhan
Buena técnica ¿No necesita un paso 'git init --bare' en el servidor, antes de insertar el repositorio git-svn allí? Tuve que hacer esto.
Clayton Stanley
Probablemente no sea el valor predeterminado, pero puede vincular svn: externos a una revisión específica al igual que lo hacen los submódulos git.
MarcH
8

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

En el servidor que ejecuto:

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 repositorio simple, luego 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 fix-svn-refs.sh de http://www.shatow.net/fix-svn-refs.sh Esto se inspiró principalmente en: http://gsocblog.jsharpe.net/archives/12

No estoy seguro de por qué git gcse necesita aquí, pero no pude hacerlo git pullsin él.

Entonces, después de todo esto, puede usar git submodule siguiendo las instrucciones de rq.

Sherbang
fuente
Uno podría pensar que incluso podría hacer esto como un enlace de compromiso.
Andres Jaan Tack
6

Actualmente git-svn no es compatible con svn: externals . Pero hay otras dos herramientas que pueden ayudarlo:

  1. SubGit

    SubGit es una solución del lado del servidor, permite el acceso de Git al repositorio de Subversion y viceversa. Puede consultar la documentación para obtener más detalles, pero en general es bastante fácil usar SubGit:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    El comando anterior detectará el diseño de ramas en el proyecto SVN y luego creará un repositorio vacío vacío de Git listo para reflejar el proyecto SVN. Es posible que se le soliciten las 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.txtpara asignar nombres de autores SVN a identidades Git.

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

    En este momento tiene el repositorio Subversion conectado al repositorio Git recién creado. SubGit traduce la revisión de SVN en Git commit en cada svn commity Git commit en la revisión de SVN en cada git push.

Todo lo que necesita más es hacer que el repositorio de Git esté disponible para los encargados. Echa un vistazo a git-http-backend para eso. Luego puede agregar el repositorio Git creado como un submódulo habitual. SubGit también está disponible como complemento para Bitbucket Server, para obtener más información, consulte aquí . Por lo tanto, no hay necesidad de usar herramientas externas como git-svn o cualquier otra.

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

  1. SmartGit

    SmartGit reemplaza git-svn en el lado del cliente. Puede encontrar más información sobre sus características aquí .

    En particular, SmartGit admite submódulos git y svn: externals , puede mezclarlos en su repositorio.

    SmartGit es un software patentado pero es gratuito para uso no comercial.

vadishev
fuente
Tanto el subgit( subgit.com/documentation/… ) como el smartgitsoportan svn:externalsde la misma manera un .gitsvnextmodulesarchivo explícito en una copia de trabajo. Lo que significa que todavía tiene que usar este software para pagar externos y no puede usar la gitutilidad básica para retirarlos directamente desde un servidor externo git hub como githubo gitlab. Por lo tanto, las fuentes publicadas snv:externalsen un servidor git hub externo no serán observables y descargables sin este software, que sigue siendo un problema importante.
Andry
4

Además de lo que dijo rq, otro método sería utilizar el proyecto "externo" de terceros ( http://nopugs.com/ext-tutorial ), que imita mejor cómo funcionan las referencias externas svn. Con los elementos externos, puede realizar un seguimiento de los repositorios git o svn, y parece más fácil llevar sus cambios corriente arriba a esos repositorios. Sin embargo, requiere que los miembros del proyecto descarguen e instalen el paquete por separado.

Todavía no he usado submódulos o externos; Sin embargo, he pasado algunas horas leyendo sobre todas las alternativas y parece que las externas se adaptarán mejor a mis necesidades. Hay una excelente discusión sobre estos y otros métodos personalizados en el Capítulo 15 de "Control de versiones con Git", por Jon Loeliger ( http://oreilly.com/catalog/9780596520120 ), que recomiendo encarecidamente.

pcuenca
fuente
0

Piston se está reescribiendo para admitir esto, y viceversa, más la URL de Subversion existente en un repositorio de Subvresion y git + git.

Echa un vistazo al repositorio de pistón Github .

Lamentablemente, no parece haber sido lanzado.

Otón
fuente
3
Sin embargo, el pistón fallará en tu cara cuando más lo necesites;), así que no lo recomiendo. Además, ya no hay correcciones de errores para el pistón.
Henrik el
0

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

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

Deberia trabajar. ¿Lo hace?

mcepl
fuente