È possibile avere un repository Subversion come sottomodulo Git?


154

C'è un modo per aggiungere un repository Subversion come sottomodulo Git nel mio repository Git?

Qualcosa di simile a:

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

Dove https://svn.foo.com/svn/projpunta a un repository Subversion.

So che c'è git-svnche permette di interagire con un repository Subversion. Quindi sto pensando, forse c'è un modo per fare il checkout di un repository Subversion git-svne poi usarlo come sottomodulo.

Risposte:


127

No. La tua scommessa migliore sarebbe quella di impostare un mirror del repository svn in un repository git dedicato.

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

Quindi è possibile aggiungere il repository git come sottomodulo al progetto originale

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

C'è una differenza concettuale tra svn: externals e git submodule che può farti inciampare se ti avvicini a questo punto di vista della sovversione. Il sottomodulo git è ancorato alla revisione che gli viene fornita. Se "upstream" cambia, allora devi aggiornare il riferimento del tuo sottomodulo.

Quindi, quando risincronizziamo con la sovversione a monte:

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

... il progetto git utilizzerà ancora la revisione originale che abbiamo commesso in precedenza. Per aggiornare a svn HEAD, dovresti usare

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

1
Hai provato questi codici prima di pubblicarlo qui? i sottomoduli non possono funzionare correttamente su git svn.
Xhan,

4
@xhan sì, e non sto sostenendo di mescolare git-svn e sottomoduli nello stesso repository. Il clone che usa git-svn è solo un bridge per creare un clone git nativo del repository svn.
Richq,

spiacente. Non ti ho trovato usando due cartelle per fungere da sottomoduli. bel trucco.
Xhan,

Bella tecnica. Non è necessario un passaggio 'git init --bare' sul server, prima di inviare lì il repository git-svn? Ho dovuto farlo.
Clayton Stanley,

Probabilmente non è l'impostazione predefinita ma puoi associare svn: externals a una revisione specifica proprio come fanno i sottomoduli git.
MarcH,

8

Ho appena superato questo. Sto facendo qualcosa di simile a rq, ma leggermente diverso. Ho installato uno dei miei server per ospitare questi cloni git dei repository svn di cui ho bisogno. Nel mio caso voglio solo versioni di sola lettura e ho bisogno di un repository nudo sul server.

Sul server 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

Questo imposta il mio repository nudo, quindi ho uno script cron per aggiornarlo:

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

Ciò richiede anche fix-svn-refs.sh da http://www.shatow.net/fix-svn-refs.sh Questo è stato principalmente ispirato da: http://gsocblog.jsharpe.net/archives/12

Non sono sicuro del motivo per cui git gcè necessario qui, ma non sono riuscito a farne a git pullmeno.

Quindi, dopo tutto questo, puoi usare git submodule seguendo le istruzioni di rq.


Si potrebbe pensare che si possa anche fare questo come hook di commit.
Andres Jaan Tack,

6

Attualmente git-svn non supporta svn: externals . Ma ci sono altri due strumenti che possono aiutarti:

  1. SubGit

    SubGit è una soluzione lato server, che consente a Git l'accesso al repository Subversion e viceversa. Puoi fare riferimento alla documentazione per maggiori dettagli, ma in generale è abbastanza facile usare SubGit:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    Il comando sopra rileverà il layout dei rami nel progetto SVN e quindi creerà un repository Git vuoto vuoto pronto per il mirroring del progetto SVN. È possibile che vengano richieste credenziali a meno che non siano già archiviate nella cache delle credenziali SVN nella directory ~ / .subversion. Puoi anche regolare $GIT_REPO/subgit/authors.txtper mappare i nomi degli autori SVN alle identità di Git.

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

    Al momento hai un repository Subversion collegato al repository Git appena creato. SubGit traduce la revisione SVN in commit Git su ogni svn commite il commit Git in revisione SVN su ogni git push.

Tutto ciò di cui hai bisogno è rendere il repository Git disponibile per i committer. Dai un'occhiata a git-http-backend per questo. Quindi è possibile aggiungere il repository Git creato come un normale sottomodulo. SubGit è disponibile anche come componente aggiuntivo per il server Bitbucket, per saperne di più consulta qui . Quindi, non è necessario utilizzare strumenti esterni come git-svn o altri.

SubGit è un software proprietario ma è gratuito per le piccole aziende (fino a 10 committer), progetti accademici e open source.

  1. SmartGit

    SmartGit sostituisce git-svn sul lato client. Maggiori informazioni sulle sue funzionalità sono disponibili qui .

    In particolare SmartGit supporta sia i sottomoduli git che svn: esterni , è possibile mescolarli nel proprio repository.

    SmartGit è un software proprietario ma è gratuito per uso non commerciale.


Sia subgit( subgit.com/documentation/… ) che i smartgitsupportano svn:externalsallo stesso modo da un .gitsvnextmodulesfile esplicito in una copia funzionante. Ciò significa che devi ancora utilizzare questi software per il checkout degli esterni e non puoi utilizzare l' gitutilità di base per eseguire il checkout di quegli esterni direttamente da un server hub git esterno come githubo gitlab. Quindi i sorgenti collegati ad un snv:externalsserver git hub esterno non saranno osservabili e scaricabili senza questi software, che è ancora un problema significativo.
Andry

4

Oltre a ciò che ha detto rq, un altro metodo sarebbe quello di utilizzare il progetto "esterni" di terze parti ( http://nopugs.com/ext-tutorial ), che imita meglio come funzionano i riferimenti esterni svn. Con gli esterni puoi tenere traccia dei repository git o svn e sembra più facile spingere le tue modifiche a monte di tali repository. Tuttavia, richiede ai membri del progetto di scaricare e installare il pacchetto separato.

Non ho ancora usato sottomoduli o esterni; tuttavia, ho trascorso alcune ore a leggere su tutte le alternative e sembra che gli esterni si adattino meglio alle mie esigenze. C'è una discussione eccellente su questi e altri metodi personalizzati nel capitolo 15 di "Controllo versione con Git", di Jon Loeliger ( http://oreilly.com/catalog/9780596520120 ), che consiglio vivamente.


0

Piston viene riscritto per supportare questo, e viceversa, oltre all'URL Subversion esistente in un repoistory Subvresion e git + git.

Dai un'occhiata al repository Github del pistone .

Purtroppo non sembra essere stato rilasciato.


3
Pistone fallirà in faccia quando ne avrai più bisogno;), quindi non lo consiglio. Inoltre non ci sono più correzioni di bug per il pistone.
Henrik,

0

Bene, c'è git-remote-testsvn, quindi immagino qualcosa del genere

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

dovrebbe funzionare. Vero?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.