สาขาระยะไกลจาก 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 ให้พวกเขาอยู่ในพื้นที่และพยายามทำให้พวกเขาได้รับการยอมรับตั้งแต่ต้นน้ำอยู่ดี
git
noob ที่นี่) คำถามด่วน ฉันทำสิ่งนี้กับ repo SVN ขนาดใหญ่และออกมาถึง ~ 141 เมกะไบต์ ฉันผลักมันไปที่ github แล้วโคลนกลับลงมาและมันออกมาเป็น 130 เมกะไบต์ ฉันวิ่งgit gc
ทั้งสองอย่าง สิ่งที่สามารถอธิบายถึงความแตกต่าง?