Apakah mungkin memiliki repositori Subversion sebagai submodule Git?


154

Apakah ada cara untuk menambahkan repositori Subversion sebagai submodule Git di repositori Git saya?

Sesuatu seperti:

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

Di mana https://svn.foo.com/svn/projmenunjuk ke repositori Subversion.

Saya tahu ada git-svnyang memungkinkan seseorang untuk berinteraksi dengan repositori Subversion. Jadi saya berpikir, mungkin ada cara untuk checkout repositori Subversion dengan git-svndan kemudian menggunakannya sebagai submodule.

Jawaban:


127

Tidak. Taruhan terbaik Anda adalah mengatur mirror dari repositori svn di repositori git khusus.

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

Kemudian Anda dapat menambahkan repositori git sebagai submodule ke proyek asli

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

Ada satu perbedaan konseptual antara svn: eksternal dan submodule git yang mungkin membuat Anda tersandung jika Anda mendekati ini dari sudut pandang subversi. Subjek git dipatok pada revisi yang Anda berikan. Jika "hulu" berubah, maka Anda harus memperbarui referensi submodule Anda.

Jadi ketika kita melakukan sinkronisasi ulang dengan subversi hulu:

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

... proyek git masih akan menggunakan revisi asli yang kami lakukan sebelumnya. Untuk memperbarui ke KEPALA svn, Anda harus menggunakan

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

1
Sudahkah Anda mencoba kode ini sebelum mempostingnya di sini? submodules tidak dapat bekerja dengan baik di git svn.
xhan

4
@ xhan ya, dan saya tidak menganjurkan pencampuran git-svn dan submodula dalam repositori yang sama. Klon yang menggunakan git-svn hanyalah sebuah jembatan untuk membuat klon git asli dari repositori svn.
richq

Maaf. Saya belum menemukan Anda menggunakan dua folder untuk bertindak sebagai submodul. trik yang bagus.
xhan

Teknik yang bagus. Tidakkah Anda memerlukan langkah 'git init --bare' di server, sebelum mendorong repo git-svn di sana? Saya harus melakukan ini.
Clayton Stanley

Ini mungkin bukan default tetapi Anda dapat mengikat svn: eksternal ke revisi tertentu seperti halnya git submodules.
MarcH

8

Saya baru saja melewati ini. Saya melakukan sesuatu yang mirip dengan rq, tetapi sedikit berbeda. Saya mengatur salah satu server saya untuk meng-host klon git dari repo svn yang saya butuhkan. Dalam kasus saya, saya hanya ingin versi read-only, dan perlu repo telanjang di server.

Di server saya jalankan:

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

Ini mengatur repo kosong saya, maka saya memiliki skrip cron untuk memperbaruinya:

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

Ini juga memerlukan fix-svn-refs.sh dari http://www.shatow.net/fix-svn-refs.sh. Hal ini sebagian besar terinspirasi oleh: http://gsocblog.jsharpe.net/archives/12

Saya tidak yakin mengapa git gcini diperlukan di sini, tetapi saya tidak dapat melakukannya git pulltanpa itu.

Jadi setelah semua ini, Anda kemudian dapat menggunakan submit git mengikuti instruksi rq.


Orang akan berpikir Anda bahkan bisa melakukan ini sebagai pengait.
Andres Jaan Tack

6

Saat ini git-svn tidak mendukung svn: eksternal . Tetapi ada dua alat lain yang dapat membantu Anda:

  1. SubGit

    SubGit adalah solusi sisi server, ini memungkinkan akses Git ke repositori Subversion dan sebaliknya. Anda dapat merujuk pada dokumentasi untuk detail lebih lanjut, tetapi secara umum cukup mudah untuk menggunakan SubGit:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    Perintah di atas akan mendeteksi tata letak cabang di proyek SVN dan kemudian akan membuat repositori bare Git kosong yang siap untuk mencerminkan proyek SVN. Anda dapat dimintai kredensial kecuali yang sudah disimpan dalam cache kredensial SVN di direktori ~ / .subversion. Anda juga dapat menyesuaikan $GIT_REPO/subgit/authors.txtuntuk memetakan nama penulis SVN ke identitas Git.

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

    Pada saat ini Anda memiliki repositori Subversion yang terhubung ke repositori Git yang baru dibuat. SubGit menerjemahkan revisi SVN ke dalam Git commit pada setiap svn commitdan Git komit ke dalam revisi SVN pada setiap git push.

Semua yang Anda butuhkan lebih lanjut adalah membuat repositori Git tersedia untuk pengendara. Lihatlah git-http-backend untuk itu. Kemudian Anda dapat menambahkan repositori Git yang dibuat sebagai submodule biasa. SubGit juga tersedia sebagai tambahan untuk Bitbucket Server, untuk mengetahui lebih lanjut lihat di sini . Jadi, tidak perlu menggunakan alat eksternal seperti git-svn atau lainnya.

SubGit adalah perangkat lunak berpemilik, tetapi gratis untuk perusahaan kecil (hingga 10 komuter), proyek akademik dan sumber terbuka.

  1. SmartGit

    SmartGit menggantikan git-svn di sisi klien. Informasi lebih lanjut tentang fitur-fiturnya dapat Anda temukan di sini .

    Secara khusus, SmartGit mendukung submitula git dan svn: eksternal , Anda dapat mencampurnya dalam repositori Anda.

    SmartGit adalah perangkat lunak berpemilik tetapi gratis untuk penggunaan non-komersial.


Baik subgit( subgit.com/documentation/... ) dan smartgitmendukungnya dengan svn:externalscara yang sama dengan .gitsvnextmodulesfile eksplisit dalam copy pekerjaan. Yang berarti Anda masih harus menggunakan perangkat lunak ini untuk checkout eksternal dan Anda tidak dapat menggunakan gitutilitas dasar untuk checkout eksternal tersebut langsung dari server hub git eksternal seperti githubatau gitlab. Jadi sumber yang dirilis ke snv:externalsserver hub git eksternal tidak akan dapat diamati dan diunduh tanpa perangkat lunak ini yang masih merupakan masalah signifikan.
Andry

4

Selain apa yang dikatakan rq, metode lain adalah dengan menggunakan proyek "eksternal" pihak ketiga ( http://nopugs.com/ext-tutorial ), yang lebih baik meniru cara kerja referensi eksternal svn. Dengan eksternal, Anda dapat melacak repositori git atau svn, dan terlihat lebih mudah untuk mendorong perubahan Anda ke atas ke repo tersebut. Namun, itu mengharuskan anggota proyek untuk mengunduh dan menginstal paket terpisah.

Saya belum menggunakan submodula atau eksternal; Namun, saya telah menghabiskan beberapa jam membaca tentang semua alternatif dan sepertinya eksternal akan lebih cocok untuk kebutuhan saya. Ada diskusi yang sangat baik tentang ini dan metode khusus lainnya dalam Bab 15 dari "Kontrol Versi dengan Git", oleh Jon Loeliger ( http://oreilly.com/catalog/9780596520120 ), yang sangat saya rekomendasikan.


0

Piston sedang ditulis ulang untuk mendukung ini, dan sebaliknya, ditambah URL Subversion yang ada di repoistory Subvresion dan git + git.

Lihatlah gudang piston Github .

Sayangnya sepertinya tidak dirilis.


3
Piston akan gagal di wajah Anda saat Anda paling membutuhkannya;), jadi saya tidak merekomendasikan itu. Plus tidak ada perbaikan bug untuk piston lagi.
Henrik

0

Nah, ada git-remote-testsvn, jadi saya kira kira seperti

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

harus bekerja. Melakukannya?

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.