web-dev-qa-db-fra.com

Est-il possible d'avoir un dépôt Subversion en tant que sous-module Git?

Est-il possible d'ajouter un référentiel Subversion en tant que sous-module Git dans mon référentiel Git?

Quelque chose comme:

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

https://svn.foo.com/svn/proj pointe vers un référentiel Subversion.

Je sais qu'il existe git-svn qui permet d'interagir avec un référentiel Subversion. Je pense donc qu'il existe peut-être un moyen d'extraire un dépôt Subversion avec git-svn et de l'utiliser ensuite comme sous-module.

151
davitenio

Votre meilleur choix serait de configurer un miroir du référentiel svn dans un référentiel git dédié. 

git svn clone -s http://Subversion.example.com/ mysvnclone
cd mysvnclone
git remote add Origin [email protected]:project.git
git Push Origin master

Ensuite, vous pouvez ajouter le référentiel git en tant que sous-module au projet d'origine.

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

Il existe une différence conceptuelle entre svn: externals et le sous-module git qui peut vous faire trébucher si vous vous en approchez du point de vue de Subversion. Le sous-module git est indexé sur la révision que vous lui donnez. Si "en amont" change, vous devez alors mettre à jour la référence de votre sous-module. 

Alors, quand nous resynchronisons avec la version amont Subversion:

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

... le projet git utilisera toujours la révision originale que nous avons engagée précédemment. Pour mettre à jour svn HEAD, vous devez utiliser

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

Je viens de traverser cela. Je fais quelque chose de similaire à rq, mais légèrement différent ..__ J'ai installé l'un de mes serveurs pour héberger ces clones git du svn repos dont j'ai besoin. Dans mon cas, je ne veux que des versions en lecture seule et j'ai besoin d'un référentiel nu sur le serveur.

Sur le serveur je lance:

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

Ceci configure mon rapport nu, puis j’ai un script cron pour le mettre à jour:

#!/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')`

Cela nécessite également fix-svn-refs.sh de http://www.shatow.net/fix-svn-refs.sh Cela a été principalement inspiré par: http: //gsocblog.jsharpe .net/archives/12

Je ne sais pas pourquoi le git gc est nécessaire ici, mais je n’ai pas pu faire un git pull sans ce dernier.

Donc, après tout cela, vous pouvez utiliser git submodule en suivant les instructions de rq.

8
sherbang

Actuellement, git-svn ne prend pas en charge svn: externals. Mais il existe deux autres outils pouvant vous aider:

  1. SubGit

    SubGit est une solution côté serveur, elle permet à Git d'accéder au référentiel Subversion et inversement. Vous pouvez vous référer à documenation pour plus de détails, mais en général, il est assez facile d’utiliser SubGit:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    La commande ci-dessus détectera la disposition des branches dans le projet SVN, puis créera un référentiel vide Git vide, prêt à refléter le projet SVN. Des informations d'identification peuvent vous être demandées, à moins que celles-ci ne soient déjà stockées dans le cache des informations d'identification SVN dans le répertoire ~/.Subversion. Vous pouvez également ajuster $GIT_REPO/subgit/authors.txt pour mapper les noms d’auteurs SVN sur les identités Git.

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

    À ce moment, le référentiel Subversion est connecté au référentiel Git récemment créé. SubGit traduit la révision SVN en validation Git à chaque svn commit et la validation Git en révision SVN à chaque git Push.

Tout ce dont vous avez besoin est de rendre le référentiel Git disponible pour les auteurs. Jetez un coup d'œil à git-http-backend pour cela. Ensuite, vous pouvez ajouter le référentiel Git créé en tant que sous-module habituel. SubGit est également disponible en tant qu’add-on pour le serveur Bitbucket, pour en savoir plus, consultez ici . Il n’est donc pas nécessaire d’utiliser des outils externes tels que git-svn ou d’autres.

SubGit est un logiciel propriétaire, mais il est gratuit pour les petites entreprises (jusqu’à 10 personnes), les projets académiques et les projets à code source ouvert.

  1. SmartGit

    SmartGit remplace git-svn côté client. Vous trouverez plus d’informations sur ses fonctionnalités ici .

    En particulier, SmartGit prend en charge les sous-modules git et svn: externals, vous pouvez les mélanger dans votre référentiel.

    SmartGit est un logiciel propriétaire, mais il est gratuit pour une utilisation non commerciale.

5
vadishev

En plus de ce que rq a dit, une autre méthode consisterait à utiliser le projet "externals" tiers ( http://nopugs.com/ext-tutorial ), qui imite mieux le fonctionnement des références externes de svn. Avec externals, vous pouvez suivre les dépôts git ou svn, et il semble plus facile de reporter vos modifications en amont vers ces dépôts. Toutefois, les membres du projet doivent télécharger et installer le package séparé.

Je n'ai pas encore utilisé de sous-modules ou d'externals; Cependant, j'ai passé quelques heures à lire toutes les alternatives et il semble que les solutions externes seront mieux adaptées à mes besoins. Il existe une excellente discussion sur ces méthodes et d’autres méthodes personnalisées au chapitre 15 de "Contrôle de version avec Git" de Jon Loeliger ( http://oreilly.com/catalog/9780596520120 ), que je recommande vivement.

4
pcuenca

Piston est en cours de réécriture pour prendre en charge ceci, et l’inverse, ainsi que l’URL Subversion existante dans un répertoire Subvresion et git + git.

Consultez le référentiel de piston Github .

Malheureusement, il ne semble pas avoir été publié.

0
Otto

Eh bien, il y a git-remote-testsvn, donc je suppose que quelque chose comme

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

devrait marcher. Le fait-il?

0
mcepl