ฉันจะสร้าง repo GitHub ใหม่จากสาขาใน repo ที่มีอยู่ได้อย่างไร


170

ฉันมีสาขาหลักและสาขาโครงการใหม่ และตอนนี้ฉันอยากจะสร้าง repo ใหม่ด้วยต้นแบบของมันตามสาขาโครงการใหม่

แบ็คกราวน์: ฉันมีที่เก็บเดียวซึ่งมีสามแอปพลิเคชันอิสระ มันไม่ได้เริ่มต้นด้วยวิธีนี้ เดิมมีเพียงหนึ่งแอพใน repo อย่างไรก็ตามเมื่อเวลาผ่านไปความต้องการทางธุรกิจมีการเปลี่ยนแปลง แอปหนึ่งกลายเป็นสองแอพ (เวอร์ชันเก่าและเขียนใหม่) มีการเพิ่มบริการเว็บ มีการใช้สาขาแยกกันเพื่อบรรจุสามโครงการ อย่างไรก็ตามพวกเขาไม่เปิดเผยรหัสใด ๆ และง่ายกว่าที่จะแบ่งพวกเขาออกเป็น repos ของพวกเขาเอง

คำตอบ:


294

ฉันเริ่มต้นด้วยแนวคิดของ @ user292677 และทำการปรับปรุงเพื่อแก้ไขปัญหาของฉัน:

  1. สร้างrepo ใหม่ใน GitHub
  2. cd ไปที่สำเนาในเครื่องของคุณสำหรับ repo เก่าที่คุณต้องการแยกออกมาซึ่งถูกตั้งค่าให้ติดตามสาขาโครงการใหม่ที่จะกลายเป็นมาสเตอร์ของrepo ใหม่
  3. $ git push https://github.com/accountname/new-repo.git +new-project:master

repo Github ใหม่เสร็จสิ้นแล้ว ผลที่ได้คือ;

  • พื้นที่เก็บข้อมูล Github ใหม่ชื่อใหม่ repo ,
  • ซึ่งmasterสอดคล้องกับโครงการใหม่ของ repo เก่าด้วย
  • เก็บประวัติทั้งหมดไว้

ในความเป็นจริงฉันพบว่าโดยใช้วิธีนี้ฉันสามารถสร้าง repo ใหม่ด้วยการเลือกสาขาเลือกด้วยมือเปลี่ยนชื่อตามที่ฉันต้องการ:

$ git push git@github.com:accountname/new_repo +new-project:master +site3a:rails3

ผลที่ได้คือว่ามีอยู่ก่อนsite3aสาขาขณะนี้ยังย้ายไป repo ใหม่และจะปรากฏเป็นrails3 มันใช้งานได้ดีจริงๆ: แผนภาพเครือข่ายแสดงต้นแบบใหม่และRails3 ที่มีประวัติเต็มและความสัมพันธ์ที่ถูกต้องซึ่งกันและกัน

อัปเดต 2013-12-07: ใช้สิ่งนี้กับโครงการอื่นและตรวจสอบว่าสูตรนี้ยังใช้งานได้

อัปเดต 2018-01-11: อัปเดตขั้นตอนที่ 3 เพื่อใช้คำแนะนำ GitHub สำหรับโปรโตคอล https สูตรยังคงใช้งานได้


สวัสดี @Dogweather ขอบคุณที่แบ่งปันสิ่งนี้ คุณสามารถอธิบายความแตกต่างระหว่างวิธีการของคุณและเปลี่ยนจุดเริ่มต้น URL ระยะไกลแล้วเปลี่ยนเป็นวิธีซื้อคืนใหม่ได้หรือไม่
Vincent

5
Dogweather ฉันใช้วิธีแก้ปัญหาของคุณมากกว่าที่ฉันจำได้ ขอบคุณ! ฉันต้องเช็คเอาต์ old_branch ก่อนที่มันจะทำงานให้ฉัน
Bjorn Theart

3
โปรดทราบว่าสิ่งนี้จะไม่คัดลอกแท็ก ฉันเชื่อว่าคุณอาจต้องการ--follow-tagsสิ่งนั้น
Factor Mystic

1
โปรดทราบว่าคุณไม่จำเป็นต้องสร้าง repo บน Github คุณสามารถpushไปที่git init
Repeat

1
ฉันไม่ต้องการที่จะถ่ายโอนประวัติการกระทำทั้งหมดของฉันไปที่ repo ใหม่ฉันแค่ต้องการคัดลอกการกระทำที่เป็นของที่เก็บเด็ก เป็นไปได้ไหม?
Arbaz Rizvi

26

ปรับปรุง:

cd ไปที่ repo ในพื้นที่ที่มี old_branch และ:

$ git push https://github.com/accountname/new_repo.git +old_branch:master

9
git clone -b new-project /path/to/repo /new/repo/path

แก้ไข: ภายใน GitHub คุณสามารถ "แยก" repo จากนั้นไปที่แท็บผู้ดูแลระบบในโคลนของคุณ ใต้ "ชื่อพื้นที่เก็บข้อมูล" และ "การเปิดเผย" คือ "สาขาเริ่มต้น" พร้อมเมนูแบบเลื่อนลงของสาขา new-projectเลือก

แก้ไขใหม่: ฉันเพิ่งรู้ว่าเป็นmasterสาขาที่คุณต้องการตั้งค่าไม่ใช่แค่สาขา "เริ่มต้น" ดังนั้น…

  • บน GitHub them/repoให้ทำyou/repoตาม
  • วิ่ง git clone git@github.com:you/repo.git
  • gitkเริ่มต้น
  • [คุณอาจต้องการที่จะสร้างold-masterสาขาเพื่อที่คุณจะได้ไม่หลงลืมงานเก่า ๆ ]
  • ค้นหาการกระทำล่าสุดในnew-projectสาขาคลิกขวาที่ข้อความการกระทำและเลือก "รีเซ็ตสาขาหลักไปที่นี่" (คุณสามารถทำสิ่งนี้ได้ที่บรรทัดคำสั่งโดยใช้git-resetแต่ฉันยังไม่พบการเรียกที่ถูกต้อง)

การผลักดันครั้งต่อไปที่ repo GitHub ของคุณจะต้องดำเนินการด้วย--forceตัวเลือก แต่ไม่เช่นนั้นคุณก็ทำได้

หากเป็นหนึ่งใน repos ของคุณเองคุณกำลังทำสิ่งนี้กับ ...

  • วิ่ง git clone git@github.com:you/orig.git
  • วิ่ง git clone orig copy
  • ดังที่ฉันได้อธิบายไว้ข้างต้น แต่จากภายในcopyrepo ท้องถิ่นให้รีเซ็ตmasterสาขาเป็นที่ที่คุณต้องการ
  • you/copyสร้างโครงการ GitHub ที่ว่างเปล่า ทำตามคำแนะนำบน GitHub เพื่อตั้งค่าโครงการนั้นเป็นรีโมทสำหรับเวอร์ชันท้องถิ่นcopyกดmasterและคุณเสร็จแล้ว!

อืม! ฉันไม่แน่ใจว่าจะทำขั้นตอนแรกได้อย่างไร: คัดลอก repo ภายใน GitHub ฉันไม่คิดว่ามันเป็นไปได้
Dogweather

@Dogweather เรียกว่า "forking" บน GitHub; ฉันได้แก้ไขคำตอบเพื่อความชัดเจน
JC Salomon

ฉันไม่สามารถแยกธุรกรรมซื้อคืนภายในหนึ่งบัญชี คุณลองตัวเองแล้วหรือยัง
Dogweather

5
  1. สร้าง NEW_REPOSITORY ใน gitHub
  2. cd OLD_REPOSITORY
  3. git push https://github.com/accountname/NEW_REPO + master: master

และนั่นคือทั้งหมดที่ (หมายเหตุ: ประวัติ git ถูกเก็บรักษาไว้)

ฉันลองคำตอบข้างต้นแล้วและพบว่ามันไม่เจาะจงพอเพราะไม่ได้ระบุ + master: master ซึ่งเป็นสิ่งที่ฉันต้องการเพื่อให้ทำงานได้ มันใช้งานได้ดี

แหล่งที่มา (ด้วยการแก้ไขของฉันเพื่อหลีกเลี่ยงปัญหา ssh กับ github): Mauricio Aiello อดีตผู้พัฒนา Java อาวุโสhttps://www.quora.com/How-do-I-create-a-new-GitHub-repository-from-a -branch ในใช้พื้นที่เก็บข้อมูลที่มีอยู่


ที่จริงแล้วสามารถใช้งานได้มากกว่าคำตอบที่ยอมรับ มันทำงานได้แม้ในสถานการณ์ที่ Git บ่นเกี่ยวกับข้อผิดพลาดของ src refspec เมื่อไม่สามารถส่งเก่าไปยังที่เก็บใหม่
Informagic

2

ไม่แน่ใจว่านี่เป็นวิธีที่ดีหรือไม่ แต่มันง่ายอยู่แล้ว:

git clone -b new-project git@github.com:User/YourProject.git newProjcet

จากนั้นสร้าง repo ใหม่บน GitHub และผลักดันมัน


2

การจำไว้ว่าเมื่อคุณเพียงสร้าง repo ใหม่คุณจะสูญเสียการอ้างอิงไปที่เก่าและทำให้ยากที่จะรักษาปรับปรุงใด ๆ กับโครงการเดิมที่ซิงก์ไปที่ใหม่ บางทีมันอาจจะไม่ดีกว่าที่จะแยก repo?


0

นอกจากนี้เล็กน้อยเพื่อคำตอบที่ถูกต้อง:

$ git push git@github.com: accountname / new_repo + old_branch: master

"git@github.com: accountname / new_repo" => รับจาก github "Clone หรือดาวน์โหลด" เมนูแบบเลื่อนลง

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