แยกและซิงโครไนซ์ที่เก็บ Google Code Subversion ลงใน GitHub


131

ฉันจะแยกและซิงค์กับที่เก็บ Google Code Subversion ที่ฉันไม่มีสิทธิ์เขียนลงในที่เก็บ GitHub ได้อย่างไร

ฉันต้องการที่จะพัฒนาคุณลักษณะของตัวเองในที่เก็บ Git ของฉัน แต่ฉันก็ต้องการซิงโครไนซ์กับที่เก็บ Google Code Subversion เพื่อดึงการแก้ไขจากฝั่งโครงการ Google Code

ฉันรู้เกี่ยวกับ git-svn และเคยใช้มาก่อนเพื่ออัพและดาวน์สตรีมไปยังที่เก็บการโค่นล้มฉันสามารถควบคุมได้ทั้งหมด แต่ฉันไม่รู้ว่าจะซิงค์กับที่เก็บ Google Code Subversion อย่างไร

คำตอบ:


178

สาขาระยะไกลจาก git-svn นั้นค่อนข้างเหมือนกับ Git remote ทั่วไป ดังนั้นในพื้นที่เก็บข้อมูลในเครื่องของคุณคุณสามารถมี git-svn โคลนของคุณและผลักดันการเปลี่ยนแปลงออกไปยัง GitHub Git ไม่สนใจ หากคุณสร้าง git-svn clone ของคุณและพุชการเปลี่ยนแปลงเดียวกันทั้งหมดไปยัง GitHub คุณจะมีมิเรอร์ที่ไม่เป็นทางการของที่เก็บ Google Code ส่วนที่เหลือเป็นวานิลลากิต

git svn clone http://example.googlecode.com/svn -s
git remote add origin git@github.com:example/example.git
git push origin master

ตอนนี้คุณมีสิ่งนี้แล้วบางครั้งคุณจะต้องซิงโครไนซ์ที่เก็บการโค่นล้มกับ Git จะมีลักษณะดังนี้:

git svn rebase
git push

ใน gitk หรืออะไรก็ตามสิ่งนี้จะมีลักษณะดังนี้:

o [master][remotes/trunk][remotes/origin/master]
|
o
|
o

และเมื่อคุณวิ่งgit svn rebaseคุณจะมีสิ่งนี้:

o [master][remotes/trunk]
|
o
|
o [remotes/origin/master]
|
o
|
o

ตอนนี้การรันgit pushจะผลักการคอมมิตเหล่านั้นออกไปยัง GitHub ซึ่งเป็นสาขา[รีโมท / ต้นทาง / มาสเตอร์] ที่นั่น และคุณจะกลับไปที่สถานการณ์ใน ASCII art diagram แรก

ปัญหาตอนนี้คือคุณจะดำเนินการเปลี่ยนแปลงของคุณในส่วนผสมอย่างไร? แนวคิดคือคุณไม่เคยผูกพันกับสาขาเดียวกับที่คุณใช้ git-svn-rebase-ing และ git-push คุณต้องมีสาขาแยกต่างหากสำหรับการเปลี่ยนแปลงของคุณ มิฉะนั้นคุณจะต้องเปลี่ยนการเปลี่ยนแปลงของคุณใหม่ที่ด้านบนของการโค่นล้มซึ่งอาจทำให้ใครก็ตามที่โคลนที่เก็บ Git ของคุณไม่พอใจ ปฏิบัติตามฉัน? ตกลงดังนั้นคุณสร้างสาขาเรียกว่า "คุณลักษณะ" และคุณทำการคอมมิตและส่งออกไปยัง GitHub ไปยังสาขาคุณสมบัติ gitk ของคุณจะมีลักษณะดังนี้:

o [features][remotes/origin/features]
|
o
|
o [master][remotes/trunk][remotes/origin/master]
|
o

ที่นี่คุณมีสาขาคุณสมบัติของคุณอยู่ก่อนสาขา Google Code ใช่ไหม? จะเกิดอะไรขึ้นเมื่อคุณต้องการรวมสิ่งใหม่ ๆ จาก Google Code คุณต้องวิ่งgit svn rebaseก่อนและรับสิ่งนี้:

                           o [features][remotes/origin/features]
[master][remotes/trunk] o  |
                        |  o
                        o /
                        |/
                        o[remotes/origin/master]
                        |
                        o

หากคุณgit pushเชี่ยวชาญคุณสามารถจินตนาการว่า[รีโมท / ต้นกำเนิด / ต้นแบบ]อยู่ที่จุดเดียวกับมาสเตอร์ แต่สาขาคุณลักษณะของคุณไม่มีการเปลี่ยนแปลง ตัวเลือกของคุณในตอนนี้คือการผสานต้นแบบเข้ากับฟีเจอร์หรือฟีเจอร์รีเบส การผสานจะมีลักษณะดังนี้

git checkout features
git merge master 

            o [features]
           /|
          / o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

จากนั้นคุณจะผลักดันคุณสมบัติออกไปยัง GitHub ฉันได้ทิ้งออกรีโมทสำหรับต้นแบบเพื่อประหยัดพื้นที่พวกเขาต้องการจะอยู่ที่จุดเดียวกับ[มาสเตอร์]

วิธีการ rebase นั้นชั่วร้ายกว่าเล็กน้อย - คุณต้องผลักดันด้วย - บังคับเนื่องจากการผลักดันของคุณจะไม่ใช่การผสานไปข้างหน้าอย่างรวดเร็ว (คุณจะดึงสาขาคุณสมบัติจากคนที่โคลน) การทำเช่นนี้ไม่ถือว่าเป็นเรื่องดี แต่ไม่มีใครสามารถหยุดคุณได้หากคุณตั้งใจจริง มันทำให้บางสิ่งง่ายขึ้นเช่นกันเช่นเมื่อแพตช์ได้รับการยอมรับต้นน้ำในรูปแบบที่ปรับปรุงใหม่เล็กน้อย ประหยัดเวลาที่ต้องยุ่งเกี่ยวกับความขัดแย้งคุณสามารถตั้งฐานข้อมูลใหม่ได้ - ข้ามแพตช์อัปสตรีม อย่างไรก็ตาม rebase จะเป็นดังนี้:

git rebase master features

         o [features]
         |
         o
         |  o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

แล้วคุณจะต้องทำgit push --forceเช่นนั้น คุณสามารถดูได้ว่าทำไมคุณต้องบังคับมันประวัติมีความแตกแยกแบบเก่าอย่างมากตั้งแต่[รีโมต / ที่มา / คุณสมบัติ]ไปจนถึงโพสต์รีเบสใหม่[คุณสมบัติ] ในปัจจุบัน

ทั้งหมดนี้ได้ผล แต่ต้องใช้ความพยายามอย่างสูง หากคุณกำลังจะเป็นผู้ร่วมให้ข้อมูลทั่วไปทางออกที่ดีที่สุดคือทำงานแบบนี้ไปสักพักส่งแพตช์อัปสตรีมและดูว่าคุณสามารถเข้าถึงการโค่นล้มได้หรือไม่ หากทำไม่สำเร็จบางทีอย่าผลักดันการเปลี่ยนแปลงของคุณออกไปยัง GitHub ให้พวกเขาอยู่ในพื้นที่และพยายามทำให้พวกเขาได้รับการยอมรับตั้งแต่ต้นน้ำอยู่ดี


ขอบคุณสำหรับคำแนะนำที่ยอดเยี่ยม ( gitnoob ที่นี่) คำถามด่วน ฉันทำสิ่งนี้กับ repo SVN ขนาดใหญ่และออกมาถึง ~ 141 เมกะไบต์ ฉันผลักมันไปที่ github แล้วโคลนกลับลงมาและมันออกมาเป็น 130 เมกะไบต์ ฉันวิ่งgit gcทั้งสองอย่าง สิ่งที่สามารถอธิบายถึงความแตกต่าง?
mpontillo

... คิดออก git push origin --mirrorผมจำเป็นต้องมี
mpontillo

ทำงานได้อย่างมีเสน่ห์ตอนนี้ฉันต้องบอกให้ผู้พัฒนา googlecode ดั้งเดิมใช้ github กับฉัน: D
electblake

สิ่งนี้ไม่ได้ผลสำหรับฉันด้วย-sตัวเลือกสำหรับgit svn cloneแต่ถ้าไม่มีมันส่วนที่เหลือก็ใช้ได้ดี
user1027169

15

svn2github บริการ

เว็บไซต์http://svn2github.com/ให้บริการแยกที่เก็บ SVN ที่เข้าถึงได้แบบสาธารณะเข้าสู่ Github (ที่https://github.com/svn2github/projectname ) ฉันลองแล้ว เมื่อกด "Make a mirror" ดูเหมือนว่าจะไม่ทำอะไรเลยสักสองสามวินาทีและแสดงข้อความ "error" แต่มันใช้งานได้จริง ที่เก็บใหม่ถูกสร้างขึ้นโดยมีรหัสจากที่เก็บ SVN

จากนั้นคุณจะแยกที่เก็บที่สร้างขึ้นและทำงานบนส้อมของคุณเอง จากนั้นคุณจะส่งการเปลี่ยนแปลงไปยังโปรเจ็กต์ต้นน้ำโดยใช้ตัวติดตามข้อบกพร่องของพวกเขา

เมื่อพิจารณาจากที่เก็บข้อมูลที่มีอยู่ภายใต้ผู้ใช้ Github ของบริการ (เช่น "svn2github ถูกผลักไปที่ svn2github / haxe เมื่อ 5 ชั่วโมงก่อน") ดูเหมือนว่าจะดึงการเปลี่ยนแปลงจากที่เก็บ SVN เป็นประจำ ไม่มีข้อมูลว่าใครเป็นผู้ใช้บริการบนเว็บไซต์ดังนั้นฉันจะไม่พนันว่ามันจะทำงานต่อไปอย่างไม่มีกำหนด แต่ตอนนี้ใช้ได้ (และถ้ามันล่มคุณยังสามารถอัปเดตส้อมของคุณด้วยตนเองได้)

ยิงจรวดขีปนาวุธ

หากคุณไม่ได้ตั้งค่าให้ใช้ Git และ Github ทางเลือกอื่นคือใช้ Launchpad.net Launchpad สามารถนำเข้าที่เก็บ SVN (เช่น CVS) โดยอัตโนมัติไปยังสาขา bzr ส่วนบุคคล ในการดำเนินการนี้ให้สร้างโครงการ Launchpad จากนั้นไปที่หน้าการนำเข้าใหม่เลือกการโค่นล้มและป้อน URL (เช่นhttp://projectname.googlecode.com/svn/trunk/) การนำเข้าครั้งแรกอาจใช้เวลา 2-3 ชั่วโมงทั้งนี้ขึ้นอยู่กับขนาดโครงการ การนำเข้าในภายหลังจะทำงานเป็นระยะ

สำหรับเอกสารเพิ่มเติมโปรดดูที่การนำเข้า VCS ใน Launchpad ช่วยเหลือ


10

เวลาเดินผ่านสำหรับการอัพเดทจาก Google Code เพื่อ GitHub สามารถใช้ได้ที่fnokd.com ผู้เขียนใช้เซิร์ฟเวอร์ระยะไกลตลอดเวลาและงาน cron เพื่อทำให้การซิงโครไนซ์เป็นไปโดยอัตโนมัติและเก็บ SVN trunk ไว้ในสาขา GitHub ที่เรียกว่า "vendor"


2

ขณะนี้ GitHub รองรับการนำเข้าโครงการโค่นล้มโดยตรงแล้ว (ดูhttp://help.github.com/import-from-subversion/ ) เพียงสร้าง repo ใหม่จากนั้นคลิก "นำเข้าจากการโค่นล้ม" ที่หน้าจอ "ขั้นตอนต่อไป" ไม่รองรับการซิงค์เพิ่มเติมแม้ว่า: /.


วิธีนี้ไม่มีอีกแล้ว
magnetik

ใช้import.github.com/new ทันทีแทน ดูhelp.github.com/articles/importing-from-subversion
Chris Arndt

1

อืม .. ใน บริษัท ฉันก็ทำเกือบเหมือนกัน เพียงแค่มีทั้ง. svn และ. git repo ในไดเร็กทอรีเดียวกัน (คุณชำระเงิน svn repo และสร้าง git repo ในสำเนาที่ใช้งานได้นี้)

จากนั้นใช้ svn ขึ้นและ git push ก็ทำสิ่งนั้น แน่นอนว่าถ้าคุณแตกต่างกันมากคุณจะต้องผสานสิ่งต่างๆด้วยมือ


ใช่ แต่ฉันต้องการหลีกเลี่ยงการมีข้อมูลเมตา. svn และหวังว่า git จะสามารถใช้ svn repos เป็นดาวน์สตรีมมาสเตอร์ได้
optixx

ดังนั้นจึงเป็นไปไม่ได้ที่จะใช้ git-svn เพื่อชำระเงิน repo และ git push ไปที่ github?
Marcin Gil

0

ฉันไม่ค่อยแน่ใจว่าคุณต้องการอะไร แต่แน่นอนว่าคุณสามารถดึงจากที่เก็บการโค่นล้มและส่งไปยังที่เก็บ Git จากสำเนาที่ใช้งานได้เดียวกัน และคุณยังสามารถgit svn dcommitกลับไปที่ที่เก็บการโค่นล้มได้ คุณไม่สามารถทำให้ที่เก็บ GitHub ซิงค์กับที่เก็บการโค่นล้มได้ นอกจากนี้เมื่อคุณคอมมิตในสำเนาการทำงานของคุณที่ยังไม่ได้อยู่ในที่เก็บการโค่นล้มคุณจะต้องสร้างฐานข้อมูลใหม่หากที่เก็บการโค่นล้มได้รับการอัปเดตโดยบังคับให้คุณgit push --forceกำหนด "ใหม่" กับ GitHub


0

ฉันพบคำแนะนำเหล่านี้ในบล็อกของYu-Jie Lin :

ก่อนอื่นให้โคลนที่เก็บการโค่นล้มแล้วกดไปที่ Git:

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo
git remote add git-foo git@github.com:username/foo.git 
git push git-foo master

หลังจากดำเนินการในที่เก็บการโค่นล้มแล้วให้รัน

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