การบังคับที่เก็บ Git จาก GitHub เป็น GitLab


95

สมมติว่าฉันต้องการแก้ไขโครงการของคนอื่น โครงการนั้นอยู่บน GitHub

ฉันสามารถสร้างทางแยกบน GitHub และดำเนินการแก้ไขได้

อย่างไรก็ตามฉันต้องการสร้างทางแยกบน GitLab แทนที่จะเป็น GitHub

เป็นไปได้หรือไม่ อย่างไร?

ฉันได้อ่านบทความนี้แล้ว: https://about.gitlab.com/2016/12/01/how-to-keep-your-fork-up-to-date-with-its-origin/

อย่างไรก็ตามฉันไม่แน่ใจว่าควรทำอย่างไรในกรณีของฉัน

  • ฉันควรสร้างทางแยกบน GitLab ของโครงการจาก GitHub หรือไม่?
  • หรือฉันควรสร้างมิเรอร์บน GitLab ของโครงการจาก GitHub?
  • หรือฉันควรสร้างมิเรอร์บน GitLab แล้วแยกมิเรอร์?
  • หรือฉันควรทำอะไรที่แตกต่างไปจากเดิมอย่างสิ้นเชิง?

แนวทางที่ถูกต้องคืออะไร.

ขอบคุณ.

อัปเดต

การมิเรอร์พื้นที่เก็บข้อมูลบน GitLab อาจไม่สมเหตุสมผล ฉันสามารถสร้างมิเรอร์ของที่เก็บ GitHub ของฉันบน GitLab ได้ แต่ฉันไม่สามารถสร้างมิเรอร์ของที่เก็บของคนอื่นได้

https://docs.gitlab.com/ee/workflow/repository_mirroring.html

นี่คือสิ่งที่ฉันได้ทำไปแล้ว:

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

เมื่อฉันต้องการรับคอมมิตใหม่จากที่เก็บ GitHub ดั้งเดิมไปยังที่เก็บบน GitLab (เช่นซิงค์ที่เก็บ) ฉันสามารถทำได้โดยใช้ที่เก็บในเครื่องของฉันเป็นขั้นตอนกลาง อย่างไรก็ตามไม่มีการเชื่อมต่อโดยตรงระหว่าง repo บน GitHub และ repo บน GitLab การตั้งค่าของฉันถูกต้องหรือไม่? จะมีความแตกต่างหรือไม่ถ้าฉันทำส้อมบน GitHub?

คำตอบ:


126

หากคุณต้องการติดตามการเปลี่ยนแปลงก่อนอื่นให้สร้างที่เก็บว่างใน GitLab (หรืออย่างอื่นที่คุณอาจใช้อยู่) แล้วโคลนลงในคอมพิวเตอร์ของคุณ

จากนั้นเพิ่มโปรเจ็กต์ GitHub เป็นรีโมต " ต้นน้ำ " ด้วย:

git remote add upstream https://github.com/user/repo

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

git pull upstream master

สุดท้ายดันกลับไปที่ที่เก็บ GitLab ของคุณเอง:

git push origin master

หากคุณไม่ต้องการดึงต้นทางต้นทาง / พุชด้วยตนเอง GitLab มีความสามารถในการมิเรอร์ในการตั้งค่า => ที่เก็บ => ที่เก็บมิเรอร์


15
ฉันแค่อยากจะเสริมคำตอบนี้ว่าเหตุใดจึงเป็นแนวทางที่ถูกต้อง "Forking" เป็นแนวคิดที่สร้างโดย GitHub จึงมีอยู่ใน GitHub เท่านั้น แต่ยังมีประโยชน์ หากคุณพิจารณาคอมไพล์ล้วนๆ (เช่นเซิร์ฟเวอร์ git แท้ที่ทำงานอยู่ที่ไหนสักแห่งในเครือข่ายของคุณ) นั่นก็เหมือนกับการโคลน repo ไปยังเซิร์ฟเวอร์ของคุณเองจากนั้นทำการโคลนข้อมูลนั้นไปยังคอมพิวเตอร์ภายในของคุณ คุณจะต้องเพิ่ม repo เดิมเป็นอัปสตรีมในเครื่อง ฉันเชื่อว่านั่นคือสิ่งที่ GitHub ทำอยู่เบื้องหลัง
Bruno Finger

9
เพียงแค่ต้องการที่จะเพิ่มฟอร์กที่ไม่อยู่ใน GitLab ดูที่นี่เช่น
bellackn

1
ฉันต้องใช้: ดึงต้นแบบต้นน้ำ - อนุญาต - ไม่เกี่ยวข้อง - ประวัติ
hmojtaba

คุณจะส่งคำขอดึงในภายหลังได้อย่างไร?
Erik Aronesty

1
@ErikAronesty นั่นเป็นเรื่องที่ยุ่งยากกว่าเนื่องจาก "คำขอดึง" ไม่ใช่เรื่องคอมไพล์ แต่เป็นเรื่อง GitHub วิธีการหนึ่งที่จะทำ แต่นี้คือการแยกสำเนาบน GitHub และเพิ่ม repo git remote add upstream-fork git@github.com:myuser/repoคดเคี้ยวของคุณเป็นระยะไกลอื่นพูด จากนั้นก็git push upstream-fork masterส่งคำขอดึงของคุณผ่านเว็บไซต์ GitHub
Chris Watts

18

วิธีเฉพาะเบราว์เซอร์:

  1. สร้างโปรเจ็กต์ใหม่ใน Gitlab (แค่โปรเจ็กต์เปล่าที่มีชื่อก็ใช้ได้)
  2. ไปที่การตั้งค่า -> Respository
  3. ป้อน GitHub URL ภายใต้ 'Mirroring repositories'
  4. ตรวจสอบให้แน่ใจว่า "ทิศทางกระจกเงา" เป็น "ดึง"
  5. กดปุ่ม 'Mirror repository'
  6. กดไอคอนซิงค์ถัดจากรายการที่ปรากฏขึ้น

ฉันไม่มีสิทธิ์การใช้งาน Enterprise Edition กล่าวคือฉันไม่สามารถเห็น "ที่เก็บมิเรอร์" จากขั้นตอนที่ 3 อย่างไรก็ตามหากฉันมีใบอนุญาตดังกล่าวฉันจะสร้างมิเรอร์ของที่เก็บ GitHub ของคนอื่นได้หรือไม่
Cimlman

1
@Cimlman มันแปลกเพราะฉันยังได้รับใบอนุญาตฟรี อาจจะตรวจสอบอีกครั้ง? ควรเป็นอันดับสามใน 'การตั้งค่า -> ที่เก็บ' เพื่อความชัดเจน: การตั้งค่าบนแถบด้านข้างไม่ใช่เมนูโปรไฟล์
aksh1618

หลังจากคลิกการตั้งค่า -> ที่เก็บบนแถบด้านข้างฉันสามารถเห็นส่วนสาขาที่ได้รับการป้องกันแท็กที่ได้รับการป้องกันการปรับใช้คีย์การปรับใช้โทเค็น
Cimlman

2
@Cimlman คุณใช้อินสแตนซ์ gitlab แบบกำหนดเองหรือไม่? ฉันมีตัวเลือกอื่น ๆ อีกมากมายในบัญชีส่วนตัวพื้นฐานบน gitlab.com
aksh1618

1
เรากำลังใช้การติดตั้งที่จัดการด้วยตนเองเวอร์ชัน 10.7.2 รุ่นล่าสุดคือ 11.6 ตกลงนี่เป็นจุดที่ดี :) ฉันไม่สามารถลองใช้วิธีแก้ปัญหาของคุณใน GitLab ของเราได้ อย่างไรก็ตามปัญหานี้ล้าสมัยสำหรับฉันแล้ว ทั้งหมดนี้เกี่ยวกับการแก้ไขข้อบกพร่องที่กำหนดเองของไลบรารีบุคคลที่สาม อย่างไรก็ตามการแก้ไขข้อบกพร่องได้รวมอยู่ในไลบรารีอย่างเป็นทางการแล้ว
Cimlman

0

การปลอมแปลงที่เก็บ github ส่วนตัวเป็นไปได้

  1. คลิกโครงการใหม่
  2. เลือกนำเข้า
  3. เลือก github
  4. OAuth2 ใช้ตรวจสอบสิทธิ์และสร้างแอป gitlab โดยอัตโนมัติ
  5. เลือกโครงการที่จะแยก

^ ฉันเพิ่งทำสิ่งนี้ด้วย repo ส่วนตัวบน github นำเข้าสำเร็จแล้ว (สาขา inc ฯลฯ ) โครงการที่นำเข้าจะถูกเก็บไว้เป็นส่วนตัวโดยอัตโนมัติ)


2
การนำเข้าโครงการต้องการ "โทเค็นการเข้าถึงส่วนบุคคล" ฉันพยายามสร้างหนึ่งบน GitHub ดูเหมือนว่าฟีเจอร์นี้จะมีประโยชน์เมื่อฉันต้องการสร้างโปรเจ็กต์บน GitLab จากโปรเจ็กต์ของฉันบน GitHub สมมติฐานนี้ถูกต้องหรือไม่? คำถามเกี่ยวกับการสร้างโครงการ GitHub ของคนอื่น
Cimlman

2
-1 เพราะและตามความคิดเห็นก่อนหน้านี้คำถามเกี่ยวกับการปลอมโครงการ github ของคนอื่น คำแนะนำในคำตอบนี้จะใช้ไม่ได้ในกรณีเช่นนี้
Nikos Alexandris

1
@NikosAlexandris แน่ใจเหรอ? คุณไม่สามารถสร้างโทเค็นการเข้าถึงสำหรับบัญชีของคุณและเข้าถึง repo ของคนอื่นที่คุณมีสิทธิ์อ่านได้หรือไม่? (ตัวอย่างเช่นทุก repo สาธารณะ)
DGoiko

0

แทนที่จะใช้ส้อมคุณสามารถนำเข้าที่เก็บ GitHub ที่เปิดเผยต่อสาธารณะโดยใช้เฉพาะเว็บอินเตอร์เฟส:

  1. จากแดชบอร์ด GitLab ของคุณคลิกโครงการใหม่
  2. สลับไปที่แท็บนำเข้าโครงการ
  3. คลิกที่Repo ตาม URLปุ่ม
  4. กรอก "Git Repository URL" และฟิลด์โปรเจ็กต์ที่เหลือ
  5. คลิกสร้างโปรเจ็กต์เพื่อเริ่มกระบวนการนำเข้า
  6. เมื่อเสร็จสิ้นคุณจะถูกเปลี่ยนเส้นทางไปยังโครงการที่สร้างขึ้นใหม่

ใช้เทคนิคนี้เมื่อเร็ว ๆ นี้และใช้ได้กับที่เก็บสาธารณะใด ๆ แม้ว่าจะไม่มีบัญชี GitHub ก็ตาม ดูหน้าเอกสาร GitLabสำหรับแหล่งที่มาของข้อมูล


1
ตกลง. และหากมีการเพิ่มคอมมิตใหม่ในที่เก็บเดิมบน GitHub ฉันสามารถผสานการเปลี่ยนแปลงกับที่เก็บบน GitHub ได้หรือไม่? นี่เป็นการดำเนินการที่ยุ่งยากและอาจไม่สามารถทำได้หากไม่มีที่เก็บกลาง (ดูย่อหน้าสุดท้ายของคำถาม)
Cimlman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.