เป็นไปได้หรือไม่ที่จะมีที่เก็บ Subversion เป็น God submodule


154

มีวิธีในการเพิ่มพื้นที่เก็บข้อมูล Subversion เป็น God submodule ในพื้นที่เก็บข้อมูล Git ของฉันหรือไม่?

สิ่งที่ต้องการ:

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

ในกรณีที่https://svn.foo.com/svn/projชี้ไปยังพื้นที่เก็บข้อมูลการโค่นล้ม

ฉันรู้ว่ามีgit-svnที่อนุญาตให้หนึ่งโต้ตอบกับพื้นที่เก็บข้อมูลการโค่นล้ม ดังนั้นฉันคิดว่าอาจมีวิธีการชำระเงินที่เก็บ Subversion ด้วยgit-svnแล้วใช้เป็น submodule

คำตอบ:


127

ไม่ทางออกที่ดีที่สุดของคุณคือตั้งค่ามิเรอร์ของ svn repository ใน git repository

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

จากนั้นคุณสามารถเพิ่มที่เก็บ git เป็น submodule ในโครงการต้นฉบับ

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 และ git submodule ที่อาจเดินทางคุณขึ้นถ้าคุณเข้าใกล้นี้จากมุมมองการโค่นล้ม submodule คอมไพล์ถูกตรึงกับการแก้ไขที่คุณให้มัน หากการเปลี่ยนแปลง "ต้นน้ำ" คุณต้องอัปเดตข้อมูลอ้างอิงของ submodule

ดังนั้นเมื่อเราซิงค์กับการโค่นล้มต้นน้ำ:

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

... โครงการ git จะยังคงใช้การแก้ไขดั้งเดิมที่เราทำไว้ก่อนหน้านี้ หากต้องการอัปเดตเป็น svn HEAD คุณจะต้องใช้

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

1
คุณลองใช้รหัสเหล่านี้ก่อนโพสต์ไว้ที่นี่หรือไม่? submodules ไม่สามารถทำงานได้อย่างถูกต้องที่ git svn
xhan

4
@ xhan ใช่และฉันไม่สนับสนุนการผสม git-svn และ submodules ในที่เก็บเดียวกัน โคลนที่ใช้ git-svn เป็นเพียงบริดจ์เพื่อสร้างโคลน git ดั้งเดิมของที่เก็บ svn
richq

ขอโทษ ฉันไม่พบคุณโดยใช้สองโฟลเดอร์เพื่อทำหน้าที่เป็น submodules เคล็ดลับดี
xhan

เทคนิคที่ดี คุณไม่ต้องการขั้นตอน 'git init --bare' บนเซิร์ฟเวอร์ก่อนที่จะส่ง repo git-svn ที่นั่นหรือ ฉันต้องทำสิ่งนี้
Clayton Stanley

อาจไม่ใช่ค่าเริ่มต้น แต่คุณสามารถผูก svn: externals กับการแก้ไขเฉพาะเช่นเดียวกับ submodules git ทำ
MarcH

8

ฉันเพิ่งผ่านสิ่งนี้ ฉันกำลังทำสิ่งที่คล้ายกับ rq แต่แตกต่างกันเล็กน้อย ฉันตั้งค่าหนึ่งในเซิร์ฟเวอร์ของฉันเพื่อโฮสต์ clit git ของ svn repos ที่ฉันต้องการ ในกรณีของฉันฉันต้องการเฉพาะรุ่นอ่านอย่างเดียวและต้องการ repo เปล่าบนเซิร์ฟเวอร์

บนเซิร์ฟเวอร์ที่ฉันเรียกใช้:

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

ชุดนี้จัดทำ repo เปล่าของฉันจากนั้นฉันมีสคริปต์ cron เพื่ออัปเดต:

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

นอกจากนี้ยังต้องใช้ fix-svn-refs.sh จากhttp://www.shatow.net/fix-svn-refs.sh ส่วนใหญ่ได้รับแรงบันดาลใจจาก: http://gsocblog.jsharpe.net/archives/12

ฉันไม่แน่ใจว่าทำไมถึงgit gcเป็นสิ่งจำเป็นที่นี่ แต่ฉันไม่สามารถทำgit pullโดยไม่ได้

ดังนั้นหลังจากทั้งหมดนี้คุณสามารถใช้ git submodule โดยทำตามคำแนะนำของ rq


ใคร ๆ ก็คิดว่าคุณสามารถทำสิ่งนี้ได้ด้วยการผูกมัดไว้
Andres Jaan Tack

6

ปัจจุบันGit-SVNไม่สนับสนุนSVN: ภายนอก แต่มีอีกสองเครื่องมือที่สามารถช่วยคุณได้:

  1. SubGit

    SubGitเป็นโซลูชันฝั่งเซิร์ฟเวอร์ช่วยให้ Git เข้าถึงที่เก็บข้อมูล Subversion และในทางกลับกัน คุณอาจอ้างถึงdocumenationสำหรับรายละเอียดเพิ่มเติม แต่โดยทั่วไปมันค่อนข้างง่ายต่อการใช้ SubGit:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    คำสั่งด้านบนจะตรวจจับเค้าโครงสาขาในโครงการ SVN จากนั้นจะสร้างพื้นที่เก็บข้อมูล Git เปล่าที่ว่างพร้อมที่จะสะท้อนโครงการ SVN คุณอาจถูกขอหนังสือรับรองหากไม่ได้เก็บไว้ในแคชข้อมูลรับรอง SVN ที่ ~ / .subversion directory คุณยังสามารถปรับแต่ง$GIT_REPO/subgit/authors.txtแผนที่ชื่อผู้เขียน SVN กับข้อมูลประจำตัว Git

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

    ในขณะนี้คุณมีที่เก็บข้อมูล Subversion เชื่อมต่อกับที่เก็บ Git ที่สร้างขึ้นใหม่ SubGit แปล SVN แก้ไขลงใน Git กระทำในทุกsvn commitและ Git กระทำลงไปใน SVN git pushแก้ไขในทุก

ทุกสิ่งที่คุณต้องการเพิ่มเติมคือการทำให้ที่เก็บ Git พร้อมใช้งานสำหรับผู้มอบหมาย ลองดูที่คอมไพล์-http แบ็กเอนด์ที่ จากนั้นคุณสามารถเพิ่มที่เก็บ Git ที่สร้างขึ้นเป็น submodule ปกติ SubGit ยังเป็น availale เป็น add-on สำหรับ Bitbucket เซิร์ฟเวอร์เพื่อหาข้อมูลเพิ่มเติมตรวจสอบที่นี่ ดังนั้นไม่จำเป็นต้องใช้เครื่องมือภายนอกใด ๆ เช่นgit-svnหรืออื่น ๆ

SubGit เป็นซอฟต์แวร์ที่เป็นกรรมสิทธิ์ แต่ฟรีสำหรับ บริษัท ขนาดเล็ก (มากถึง 10 คน) โครงการด้านวิชาการและโอเพนซอร์ซ

  1. SmartGit

    SmartGit แทนที่git-svnทางฝั่งไคลเอ็นต์ ข้อมูลเพิ่มเติมเกี่ยวกับคุณลักษณะของมันคุณอาจพบที่นี่

    โดยเฉพาะ SmartGit รองรับทั้งgit submodulesและsvn: externalsคุณสามารถผสมใน repository ของคุณได้

    SmartGit เป็นซอฟต์แวร์ที่เป็นกรรมสิทธิ์ แต่ฟรีสำหรับการใช้งานที่ไม่ใช่เชิงพาณิชย์


ทั้งsubgit( subgit.com/documentation/ ...... ) และส่วนsmartgitสนับสนุนsvn:externalsในลักษณะเดียวกันโดย.gitsvnextmodulesไฟล์ที่ชัดเจนในสำเนาที่ใช้งานได้ ซึ่งหมายความว่าคุณยังคงมีการใช้ซอฟต์แวร์เหล่านี้เพื่อ externals เช็คเอาท์และคุณไม่สามารถใช้พื้นฐานgitสาธารณูปโภคเพื่อชำระเงินภายนอกเหล่านั้นได้โดยตรงจากเซิร์ฟเวอร์คอมไพล์ศูนย์กลางภายนอกเช่นหรือgithub gitlabดังนั้นแหล่งที่มาที่เชื่อมsnv:externalsต่อกับเซิร์ฟเวอร์ฮับ git ภายนอกจะไม่สามารถตรวจสอบและดาวน์โหลดได้หากไม่มีซอฟต์แวร์เหล่านี้ซึ่งยังคงเป็นปัญหาสำคัญ
Andry

4

นอกจากสิ่งที่ rq กล่าวแล้ววิธีการอื่นจะใช้โครงการ "externals" ของบุคคลที่สาม ( http://nopugs.com/ext-tutorial ) ซึ่งเลียนแบบวิธีการอ้างอิง svn ภายนอกที่ดีกว่า ด้วยภายนอกคุณสามารถติดตามแหล่งเก็บข้อมูล git หรือ svn และดูการผลักดันการเปลี่ยนแปลงของคุณไปยัง repos เหล่านั้นได้ง่ายขึ้น อย่างไรก็ตามมันต้องการสมาชิกโครงการเพื่อดาวน์โหลดและติดตั้งแพคเกจแยกต่างหาก

ฉันยังไม่ได้ใช้ submodules หรือ externals อย่างไรก็ตามฉันใช้เวลาสองสามชั่วโมงในการอ่านเกี่ยวกับทางเลือกทั้งหมดและดูเหมือนว่าภายนอกจะเหมาะกับความต้องการของฉันมากขึ้น มีการสนทนาที่ยอดเยี่ยมเกี่ยวกับวิธีการเหล่านี้และวิธีการที่กำหนดเองอื่น ๆ ในบทที่ 15 ของ "การควบคุมเวอร์ชันด้วย Git" โดย Jon Loeliger ( http://oreilly.com/catalog/9780596520120 ) ซึ่งฉันขอแนะนำอย่างยิ่ง


0

Piston กำลังถูกเขียนใหม่เพื่อสนับสนุนสิ่งนี้และการสนทนาพร้อมกับการโค่นล้ม URL ที่มีอยู่ใน Repoistory Subvresion และ git + git

ตรวจสอบลูกสูบพื้นที่เก็บข้อมูล Github

น่าเสียดายที่ดูเหมือนว่าจะไม่ได้รับการเผยแพร่


3
Piston จะล้มเหลวในหน้าคุณเมื่อคุณต้องการมันมากที่สุด;) ดังนั้นฉันไม่แนะนำ รวมทั้งไม่มีการแก้ไขข้อผิดพลาดสำหรับลูกสูบอีกต่อไป
Henrik

0

ก็มีgit-remote-testsvnดังนั้นฉันเดาบางอย่างเช่น

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

ควรทำงาน. ทำมัน?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.