É possível ter um repositório Subversion como um submódulo Git?


154

Existe uma maneira de adicionar um repositório Subversion como um submódulo Git no meu repositório Git?

Algo como:

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

Onde https://svn.foo.com/svn/projaponta para um repositório Subversion.

Eu sei que existe um git-svnque permite interagir com um repositório do Subversion. Então, eu estou pensando, talvez haja uma maneira de fazer check-out de um repositório Subversion git-svne usá-lo como um submódulo.

Respostas:


127

Não. Sua melhor aposta seria configurar um espelho do repositório svn em um repositório git dedicado.

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

Em seguida, você pode adicionar o repositório git como um submódulo ao projeto original

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

Há uma diferença conceitual entre o submódulo svn: externals e git que pode fazer com que você se engane se você abordar isso do ponto de vista do subversion. O submódulo git está vinculado à revisão que você fornece. Se "upstream" for alterado, você precisará atualizar a referência do seu submódulo.

Então, quando ressincronizamos com a subversão upstream:

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

... o projeto git ainda usará a revisão original que comprometemos anteriormente. Para atualizar para o svn HEAD, você teria que usar

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

1
Você já tentou esses códigos antes de publicá-los aqui? Os submódulos não podem funcionar corretamente no git svn.
xhan

4
@ xhan sim, e eu não estou defendendo a mistura de git-svn e submódulos no mesmo repositório. O clone que usa git-svn é apenas uma ponte para criar um clone git nativo do repositório svn.
richq

Desculpe. Não o encontrei usando duas pastas para atuar como submódulos. belo truque.
xhan

Boa técnica. Você não precisa de uma etapa 'git init --bare' no servidor antes de enviar o repositório git-svn para lá? Eu tive que fazer isso.
Clayton Stanley

Provavelmente não é o padrão, mas você pode vincular svn: externals a uma revisão específica, assim como os sub-módulos git.
26413 MarcH

8

Eu apenas passei por isso. Estou fazendo algo semelhante ao rq, mas um pouco diferente. Eu configurei um dos meus servidores para hospedar esses clones git dos repositórios svn necessários. No meu caso, quero apenas versões somente leitura e preciso de um repositório simples no servidor.

No servidor eu 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

Isso configura meu repositório vazio, então eu tenho um script cron para atualizá-lo:

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

Isso também requer o fix-svn-refs.sh de http://www.shatow.net/fix-svn-refs.sh Isso foi inspirado principalmente por: http://gsocblog.jsharpe.net/archives/12

Não sei por que git gcé necessário aqui, mas não pude ficar git pullsem ele.

Então, depois de tudo isso, você pode usar o submódulo git seguindo as instruções da rq.


Alguém poderia pensar que você poderia fazer isso como um gancho de confirmação.
Andres Jaan Tack

6

Atualmente, o git-svn não suporta svn: externals . Mas existem duas outras ferramentas que podem ajudá-lo:

  1. SubGit

    O SubGit é uma solução do lado do servidor, permite o acesso do Git ao repositório do Subversion e vice-versa. Você pode consultar a documentação para obter mais detalhes, mas em geral é bastante fácil usar o SubGit:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    O comando acima detectará o layout das ramificações no projeto SVN e, em seguida, criará um repositório Git vazio vazio, pronto para espelhar o projeto SVN. Você pode ser solicitado a obter credenciais, a menos que já estejam armazenadas no cache de credenciais SVN no diretório ~ / .subversion. Você também pode ajustar $GIT_REPO/subgit/authors.txtpara mapear nomes de autores SVN para identidades do Git.

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

    Neste momento você tem o repositório Subversion conectado ao repositório Git recém-criado. O SubGit converte a revisão SVN em commit Git em todos svn commite Git commit em revisão SVN em todos git push.

Tudo o que você precisa é disponibilizar o repositório Git para os committers. Dê uma olhada no git-http-backend para isso. Em seguida, você pode adicionar o repositório Git criado como um submódulo usual. O SubGit também está disponível como um complemento para o Bitbucket Server, para saber mais, confira aqui . Portanto, não há necessidade de usar ferramentas externas como git-svn ou qualquer outra.

O SubGit é um software proprietário, mas é gratuito para pequenas empresas (até 10 participantes), projetos acadêmicos e de código aberto.

  1. SmartGit

    O SmartGit substitui o git-svn no lado do cliente. Mais informações sobre seus recursos, você pode encontrar aqui .

    Em particular, o SmartGit suporta os sub - módulos git e svn: externals , você pode misturá-los no seu repositório.

    O SmartGit é um software proprietário, mas é gratuito para uso não comercial.


Tanto o subgit( subgit.com/documentation/… ) quanto o smartgitsuportam svn:externalsda mesma maneira por um .gitsvnextmodulesarquivo explícito em uma cópia de trabalho. O que significa que você ainda precisa usar esse software para fazer check-out externo e não pode usar o gitutilitário básico para fazer check-out diretamente de um servidor externo do Git Hub, como githubou gitlab. Portanto, as fontes transferidas para um snv:externalsservidor de hub git externo não poderão ser observadas e baixadas sem esses softwares, o que ainda é um problema significativo.
Andry

4

Além do que a rq disse, outro método seria usar o projeto "externals" de terceiros ( http://nopugs.com/ext-tutorial ), que imita melhor como as referências externas do svn funcionam. Com externos, você pode rastrear repositórios git ou svn, e parece mais fácil enviar suas alterações a montante para esses repositórios. No entanto, exige que os membros do projeto baixem e instalem o pacote separado.

Ainda não usei submódulos ou externos; no entanto, passei algumas horas lendo sobre todas as alternativas e parece que o externo será mais adequado às minhas necessidades. Há uma excelente discussão sobre esses e outros métodos personalizados no capítulo 15 do "Controle de versão com Git", de Jon Loeliger ( http://oreilly.com/catalog/9780596520120 ), que eu recomendo fortemente.


0

O Piston está sendo reescrito para suportar isso, e o inverso, além da URL existente do Subversion em um repositório do Subvresion e git + git.

Confira o repositório do pistão Github .

Infelizmente, não parece ter sido lançado.


3
O pistão irá falhar na sua cara quando você mais precisar;), então eu não recomendo isso. Além disso, não há mais correções para o pistão.
Henrik

0

Bem, existe git-remote-testsvn, então acho que algo como

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

Deveria trabalhar. Faz?

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.