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


¿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/proj apunta a un repositorio de Subversion.

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

Author: BuZZ-dEE, 2009-01-21

6 answers

No. Tu mejor opción sería configurar una réplica 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:externals y git submodule que puede hacer tropezar si se aborda esto desde el punto de vista de subversion. El submódulo git está vinculado a la revisión que le das. Si" upstream " cambia, entonces tienes que actualizar los submódulos referencia.

Así que cuando resincronizamos con la subversión original:

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

... el proyecto git seguirá utilizando la revisión original que confirmamos anteriormente. Para actualizar a la CABEZA svn, tendría que usar

cd /path/to/gitproject/svn-project
git checkout master
git pull
cd ..
git add svn-project
git commit -m"Update submodule"
 125
Author: richq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-08 09:37:40

Acabo de pasar por esto. Estoy haciendo algo similar a rq, pero ligeramente 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 desnudo en el servidor.

En el servidor corro:

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 desnudo, 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 fue principalmente inspirado by: http://gsocblog.jsharpe.net/archives/12

No estoy seguro de por qué se necesita el git gc aquí, pero no pude hacer un git pull sin él.

Así que después de todo esto puedes usar el submódulo git siguiendo las instrucciones de rq.

 8
Author: sherbang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-07 11:32:01

Actualmente git-svn no admite svn:externals. Pero hay otras dos herramientas que pueden ayudarte:

  1. SubGit

    SubGit es una solución del lado del servidor, habilita el acceso de Git al repositorio Subversion y viceversa. Puede consultar documenation para más detalles, pero en general es bastante fácil de 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á repositorio Git vacío listo para reflejar el proyecto SVN. Se le pueden pedir credenciales a menos que estas ya estén almacenadas en la caché de credenciales SVN en~/.directorio de subversion. También puede ajustar $GIT_REPO/subgit/authors.txt para asignar nombres de autor 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 SVN en Git commit en cada svn commit y Git commit en la revisión SVN en cada git push.

Todo lo que necesitas es hacer que el repositorio Git esté disponible para los committers. 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 un complemento para el servidor Bitbucket, para obtener más información, consulte aquí. Por lo tanto, no hay necesidad de utilizar ninguna herramienta externa como git-svn o cualquier otra.

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

  1. SmartGit

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

    En particular, SmartGit soporta ambos submódulos git y svn:externals , puedes mezclarlos en tu repositorio.

    SmartGit es software privativo, pero es gratuito para uso no comercial.

 5
Author: vadishev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-29 20:15:52

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

Todavía no he usado submódulos o externos; sin embargo, he pasado algunas horas leer sobre todas las alternativas y parece que los externos serán una mejor opción para 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.

 4
Author: pcuenca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-18 17:58:11

Se está reescribiendo Piston para soportar esto, y lo contrario, más la URL de Subversion existente en un repositorio de Subvresion y git+git.

Echa un vistazo a el repositorio piston Github.

Desafortunadamente no parece haber sido lanzado.

 0
Author: Otto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-21 18:45:39

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

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

Debería funcionar. ¿Lo hace?

 0
Author: mcepl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-22 21:22:56