GitHub: จะแยกที่เก็บสาธารณะเป็นส่วนตัวได้อย่างไร


247

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

คำตอบ:


394

คำตอบนั้นถูกต้อง แต่อย่าพูดถึงวิธีซิงค์รหัสระหว่าง repo สาธารณะและทางแยก

นี่คือขั้นตอนการทำงานเต็มรูปแบบ (เราได้ทำสิ่งนี้ก่อนที่จะเปิดแหล่งข้อมูลReact Native ):


ก่อนอื่นทำซ้ำ repo ตามที่คนอื่นพูด (รายละเอียดที่นี่ ):

สร้าง repo ใหม่ (ขอเรียกว่าprivate-repo) ผ่านทางGithub UI แล้ว:

git clone --bare https://github.com/exampleuser/public-repo.git
cd public-repo.git
git push --mirror https://github.com/yourname/private-repo.git
cd ..
rm -rf public-repo.git

โคลน repo ส่วนตัวเพื่อให้คุณสามารถทำงานกับมัน:

git clone https://github.com/yourname/private-repo.git
cd private-repo
make some changes
git commit
git push origin master

หากต้องการดึงความนิยมใหม่จากการซื้อคืนสาธารณะ:

cd private-repo
git remote add public https://github.com/exampleuser/public-repo.git
git pull public master # Creates a merge commit
git push origin master

ยอดเยี่ยมตอนนี้ repo ส่วนตัวของคุณมีรหัสล่าสุดจาก repo สาธารณะรวมถึงการเปลี่ยนแปลงของคุณ


ขั้นตอนสุดท้ายในการสร้างคำขอซื้อคืน repo ส่วนตัว -> repo สาธารณะ:

ใช้ GitHub UI เพื่อสร้างทางแยกของ repo สาธารณะ (ปุ่ม "Fork" ขนาดเล็กที่ด้านบนขวาของหน้า repo สาธารณะ) แล้ว:

git clone https://github.com/yourname/the-fork.git
cd the-fork
git remote add private_repo_yourname https://github.com/yourname/private-repo.git
git checkout -b pull_request_yourname
git pull private_repo_yourname master
git push origin pull_request_yourname

ตอนนี้คุณสามารถสร้างการร้องขอดึงผ่าน Github UI สำหรับประชาชน-repo ตามที่อธิบายไว้ที่นี่

เมื่อเจ้าของโครงการตรวจสอบคำขอดึงของคุณพวกเขาสามารถรวมได้

แน่นอนว่ากระบวนการทั้งหมดสามารถทำซ้ำได้ (เพียงแค่ออกจากขั้นตอนที่คุณเพิ่มรีโมท)


2
เหตุใดจึงไม่สามารถเพิ่ม repo ส่วนตัวที่ว่างเปล่าเป็นรีโมตใหม่ไปยังโคลนทั่วไปของ repo สาธารณะแล้วกดไปที่รีโมต ความแตกต่างคืออะไร?
Falko Menge

@ FalkoMenge ฉันมีคำถามเดียวกัน การอ่านgit-scm.com/docs/git-cloneดูเหมือนว่าปกติgit cloneจะตั้งสาขาติดตามระยะไกลและอาจกำหนดค่าอื่น ๆ ใน repo ที่คุณไม่ต้องการ ในขณะที่ - แบร์โคลนเพียงแค่คัดลอก. git dir จากระยะไกลตามที่เป็นอยู่
bennlich

1
สิ่งนั้นจะผลักดันประวัติศาสตร์ความเป็นส่วนตัวให้กับสาขาสาธารณะหรือไม่
Sukhjinder Singh

1
@Sukhjinder ซิงห์ใช่ขั้นตอนสุดท้ายจะผลักดันประวัติความเป็นส่วนตัวที่จะ repo สาธารณะ หากคุณไม่ต้องการสิ่งนั้นคุณสามารถสควอชคอมมิชชันเมื่อรวมเข้ากับ repo สาธารณะและผลักดันการคอมมิชชันเดียวกับการเปลี่ยนแปลงทั้งหมดของคุณ ดูเช่นstackoverflow.com/questions/5308816/how-to-use-git-merge-squash
Martin Konicek

1
ฉันไปถึงขั้นตอนที่ฉันลอกแบบ repo ส่วนตัวแล้วทำการเปลี่ยนแปลงแล้วกด การเปลี่ยนแปลงใด ๆ ที่ฉันทำไม่มีการสังเกตโดย git git statusแสดงทุกสิ่งให้ทันสมัยต้นไม้ทำงานทำความสะอาดไม่ว่าฉันจะเปลี่ยนอะไร ดังนั้นฉันไม่สามารถกระทำและผลักดันอะไร ฉันลบ repo ส่วนตัวใหม่ฉันได้ลองอีก 2 ครั้ง แต่ก็ยังพบปัญหาเดิมอยู่ ข้อเสนอแนะใด ๆ
จะ

92

มีอีกหนึ่งตัวเลือกตอนนี้ (มกราคม - 2558)

  1. สร้าง repo ส่วนตัวใหม่
  2. บนหน้าจอ repo ที่ว่างเปล่าจะมีตัวเลือก / ปุ่ม "นำเข้า" ป้อนคำอธิบายรูปภาพที่นี่
  3. คลิกที่มันและใส่ URL repit GitHub ที่มีอยู่ไม่มีตัวเลือก GitHub กล่าวถึง แต่มันทำงานร่วมกับ repos GitHub เกินไป ป้อนคำอธิบายรูปภาพที่นี่
  4. DONE

19
งานนี้แม้ว่าจะแตกต่างกันเล็กน้อย (ฉันลองในเดือนสิงหาคม 2558) ฉันไม่พบตัวเลือกการนำเข้า / ปุ่มดังนั้น googled และลงเอยด้วย URL นี้ import.github.com/newที่นี่คุณสามารถป้อน URL GitHub ที่มีอยู่และคลิกตรวจสอบปุ่ม เมื่อยืนยันแล้วคุณสามารถป้อนชื่อ repo ใหม่ของคุณแล้วคลิกปุ่มส่วนตัวจากนั้นคลิกเริ่มต้นการนำเข้า
พระอิศวร

2
ฉันเชื่อว่า @MattvanAndel หมายความว่าความคิดเห็นนั้นถูกต้องไม่ใช่คำตอบดั้งเดิม ฉันก็ทำตามความคิดเห็นของพระอิศวรแล้วก็ใช้งานได้ โปรดทราบว่าคุณไม่ควรสร้างที่เก็บส่วนตัวในพื้นที่ก่อน!
David H

หากฉันสร้าง "ทางแยก" ส่วนตัวด้วยวิธีนี้และต้องการให้เป็นทางแยกสาธารณะอีกครั้งฉันจะทำเช่นนั้นได้หรือไม่
Anders Lindén

2
@Shiva ฉันจะโหวตถ้าคุณตอบความคิดเห็นของคุณ
bebbi

36

คำตอบปัจจุบันค่อนข้างล้าสมัยดังนั้นเพื่อความชัดเจน:

คำตอบสั้น ๆ คือ:

  1. ทำโคลนเปลือยของ repo สาธารณะ
  2. สร้างส่วนตัวใหม่
  3. ทำกระจกผลักไปที่ใหม่ส่วนตัว

เอกสารนี้มีไว้ใน GitHub: การทำสำเนา -a -repository


4
มีวิธีดึงการเปลี่ยนแปลงต้นน้ำหรือไม่? นี่เป็นสิ่งสำคัญสำหรับ repo ที่มีใบอนุญาตเสรี - ฉันได้ทำ repo ส่วนตัว แต่ยังต้องการรวมการเปลี่ยนแปลงต้นน้ำ
amarprabhu

2
ใช่. คุณควรจะสามารถเพิ่ม repo อื่น ๆ เป็น remote (tracking) ใหม่ (เช่น 'other-repo') จากนั้นดึงข้อมูลและผสานการเปลี่ยนแปลงจากมันเป็นระยะ ๆ (เช่น 'git ผสาน other-repo / เสถียร')
stefano

26

คุณต้องทำซ้ำ repo

คุณสามารถดูเอกสารนี้ (จาก GitHub)

ในการสร้างซ้ำของที่เก็บโดยไม่ต้องฟอร์กคุณจะต้องรันคำสั่งโคลนพิเศษกับที่เก็บต้นฉบับและมิเรอร์ดันไปที่ใหม่

ในกรณีดังต่อไปนี้ที่เก็บข้อมูลที่คุณพยายามที่จะส่งไป - เช่น exampleuser / new-repository หรือ exampleuser / mirrored - ควรมีอยู่แล้วบน GitHub ดู "การสร้างที่เก็บใหม่" สำหรับข้อมูลเพิ่มเติม

ทำมิเรอร์ที่เก็บ

หากต้องการทำสำเนาที่แน่นอนคุณต้องดำเนินการทั้งโคลนแบบเปลือยและแบบกดกระจก

เปิดบรรทัดคำสั่งและพิมพ์คำสั่งเหล่านี้:

$ git clone --bare https://github.com/exampleuser/old-repository.git
# Make a bare clone of the repository

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git
# Mirror-push to the new repository

$ cd ..
$ rm -rf old-repository.git
# Remove our temporary local repository

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

$ git clone --mirror https://github.com/exampleuser/repository-to-mirror.git
# Make a bare mirrored clone of the repository

$ cd repository-to-mirror.git
$ git remote set-url --push origin https://github.com/exampleuser/mirrored
# Set the push location to your mirror

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

$ git fetch -p origin
$ git push --mirror

https://help.github.com/articles/duplicating-a-repository


สิ่งนี้สร้างโคลนของ repo แต่ไม่ได้สร้างทางแยกในความหมาย GitHub เมื่อคุณสร้าง fork จริงใน GitHub มันจะแสดงข้อความ "forked จาก exampleuser / repository-to-mirror" ภายใต้ชื่อ fork นอกจากนี้ยังแสดงแผนผังของส้อมอื่น ๆ ทั้งหมดเมื่อคุณนำทางไปยัง github.com/exampleuser/new-repository/network/members
apaatsio

20

ขณะนี้ GitHub มีตัวเลือกการนำเข้าที่ให้คุณเลือกสิ่งที่คุณต้องการให้เป็นพื้นที่เก็บข้อมูลที่นำเข้าใหม่เป็นสาธารณะหรือส่วนตัว

นำเข้าที่เก็บ Github


การนำเข้ายังคงทำงานในพื้นที่เก็บข้อมูลขนาดใหญ่ (5 วัน) การเช็คเอาต์นั้นเร็วกว่ามาก แต่อาจเป็นขั้นตอนเพิ่มเติมเพื่อให้เป็นปัจจุบัน ความเชื่องช้าเป็นที่เข้าใจฉันคิดว่ามันนำเข้าทุกอย่างไม่เพียง แต่สาขาหลัก แต่ฉันหวังว่ามันจะเร็วกว่า ...
Liam Mitchell

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