Git alt modülü olarak bir Subversion deposuna sahip olmak mümkün müdür?


154

Git veri havuzumda Git alt modülü olarak bir Subversion deposu eklemenin bir yolu var mı?

Gibi bir şey:

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

Nerede https://svn.foo.com/svn/projSubversion deposu işaret eder.

git-svnBir Subversion deposu ile etkileşime izin veren olduğunu biliyorum . Bence, belki bir Subversion deposunu kontrol etmenin git-svnve sonra bir alt modül olarak kullanmanın bir yolu var .

Yanıtlar:


127

Hayır. En iyi seçeneğiniz, özel bir git deposunda svn deposunun bir aynasını oluşturmak olacaktır.

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

Daha sonra git deposunu orijinal projeye alt modül olarak ekleyebilirsiniz.

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

Svn: externals ve git submodule arasında, bir subversion bakış açısından yaklaşırsanız sizi uyarabilecek bir kavramsal fark vardır. Git alt modülü, verdiğiniz revizyona sabitlenmiştir. "Akış yukarı" değişirse, alt modülünüzün referansını güncellemeniz gerekir.

Yani yukarı akış yıkımıyla yeniden senkronize ettiğimizde:

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

... git projesi daha önce yaptığımız orijinal revizyonu kullanmaya devam edecek. Svn HEAD sürümüne güncellemek için şunu kullanmanız gerekir:

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

1
Bu kodları buraya göndermeden önce denediniz mi? alt modüller git svn'de düzgün çalışamaz.
xhan

4
@xhan evet, ve aynı depoda git-svn ve alt modüllerin karıştırılmasını savunmuyorum. Git-svn kullanan klon, yalnızca svn deposunun yerel bir git klonunu oluşturmak için kullanılan bir köprüdür.
richq

afedersiniz. Sizi alt modül olarak kullanmak için iki klasör kullanarak bulamadım. iyi numara.
xhan

Güzel teknik. Git-svn deposunu oraya itmeden önce sunucuda 'git init --bare' adımına ihtiyacınız yok mu? Bunu yapmak zorundaydım.
Clayton Stanley

Muhtemelen varsayılan değildir, ancak svn: externals'ı git alt modüllerinin yaptığı gibi belirli bir revizyona bağlayabilirsiniz.
MarcH

8

Daha yeni başladım. Ben rq benzer, ama biraz farklı bir şey yapıyorum. Ben ihtiyacım olan svn depolarının bu git klonlarını barındırmak için sunucularımdan birini ayarladım. Benim durumumda sadece salt okunur sürümleri istiyorum ve sunucuda çıplak bir repoya ihtiyacım var.

Çalıştığım sunucuda:

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

Bu benim çıplak repo kurar, daha sonra güncellemek için bir cron komut dosyası var:

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

Bu ayrıca http://www.shatow.net/fix-svn-refs.sh adresinden fix-svn-refs.sh gerektirir Bu çoğunlukla esinlenen: http://gsocblog.jsharpe.net/archives/12

git gcBurada neden gerekli olduğundan emin değilim , ama git pullonsuz yapamadım .

Bundan sonra rq'nin talimatlarını izleyerek git submodule'u kullanabilirsiniz.


Biri bunu bir taahhüt kancası olarak bile yapabileceğinizi düşünür.
Andres Jaan Tack

6

Şu anda git-svn , svn: externals'ı desteklemiyor . Ancak size yardımcı olabilecek iki araç daha var:

  1. SubGit

    SubGit sunucu tarafı bir çözümdür, Git'in Subversion deposuna erişmesini sağlar veya tersi de geçerlidir. Sen anlamlara gelebilir belgelemesi daha fazla ayrıntı için, ama genel olarak kullanım SubGit oldukça kolaydır:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    Yukarıdaki komut, SVN projesindeki şube düzenini algılar ve ardından SVN projesini yansıtmaya hazır boş çıplak Git deposu oluşturur. ~ / .Subversion dizinindeki SVN kimlik bilgileri önbelleğinde saklanmadığı sürece kimlik bilgileriniz istenebilir. $GIT_REPO/subgit/authors.txtSVN yazar adlarını Git kimlikleriyle eşleştirmek için de ayarlayabilirsiniz .

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

    Şu anda yeni oluşturulan Git deposuna bağlı Subversion deponuz var. SubGit, SVN revizyonunu her birinde Git kesinlemesine svn commitve Git her birinde SVN revizyonuna dönüştürür git push.

İhtiyacınız olan her şey Git deposunu komisyoncular için kullanılabilir hale getirmektir. Bunun için git-http-arka ucuna bir göz atın . Ardından, oluşturulan Git deposunu her zamanki bir alt modül olarak ekleyebilirsiniz. SubGit, Bitbucket Sunucusu için bir eklenti olarak da kullanılabilir ve buradan daha fazla bilgi edinebilirsiniz . Dolayısıyla, git-svn veya başka herhangi bir harici araç kullanmaya gerek yoktur .

SubGit tescilli bir yazılımdır ancak küçük şirketler (10 komisyona kadar), akademik ve açık kaynak projeleri için ücretsizdir.

  1. SmartGit

    SmartGit , istemci tarafında git-svn yerine geçer . Özellikleri hakkında daha fazla bilgiyi burada bulabilirsiniz .

    Özellikle SmartGit git alt modüllerini ve svn: externals'ı destekliyorsa , bunları deponuzda karıştırabilirsiniz.

    SmartGit tescilli bir yazılımdır, ancak ticari olmayan kullanım için ücretsizdir.


Hem subgit( subgit.com/documentation/… ) hem de smartgitdestekler svn:externals, aynı şekilde .gitsvnextmodulesçalışan bir kopyadaki açık bir dosya tarafından desteklenir . Bu, harici yazılımları kontrol etmek için hala bu yazılımı kullanmanız gerektiği anlamına gelir ve gitbu harici aygıtları doğrudan githubveya gibi harici bir git hub sunucusundan kontrol etmek için temel yardımcı programı kullanamazsınız gitlab. Bu nedenle, snv:externalsharici bir git hub sunucusunda bulunan kaynaklar , hala önemli bir sorun olan bu yazılım olmadan gözlemlenebilir ve yüklenemez.
Andry

4

Rq'nin söylediklerine ek olarak, harici referansların nasıl çalıştığını daha iyi taklit eden üçüncü taraf "harici" projesini ( http://nopugs.com/ext-tutorial ) kullanmak başka bir yöntem olacaktır . Haricilarla git veya svn depolarını takip edebilirsiniz ve değişikliklerinizi bu depoların akışına itmek daha kolay görünür. Ancak, proje üyelerinin ayrı paketi indirip yüklemesini gerektirir.

Henüz alt modülleri veya dışları kullanmadım; Ancak, tüm alternatifleri okumak için birkaç saat geçirdim ve dışsalların ihtiyaçlarım için daha uygun olacağı anlaşılıyor. Jon Loeliger ( http://oreilly.com/catalog/9780596520120 ) tarafından "Git ile Sürüm Denetimi" Bölüm 15'te bunlar ve diğer özel yöntemler hakkında mükemmel bir tartışma var .


0

Piston bunu ve bunun tersini desteklemek için yeniden yazılıyor, ayrıca bir Subvresion deposunda ve git + git'de bulunan Subversion URL'si.

Piston Github deposunu kontrol edin .

Ne yazık ki piyasaya sürülmüş gibi görünmüyor.


3
Piston en çok ihtiyacınız olduğunda yüzünüzde başarısız olacaktır;), bu yüzden bunu tavsiye etmiyorum. Ayrıca artık piston için herhangi bir hata düzeltmesi yok.
Henrik

0

Var, git-remote-testsvnsanırım böyle bir şey

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

çalışmalı. Yapar?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.