วิธีคอมไพล์บันเดิล repo ที่สมบูรณ์


116

ฉันต้องการถ่ายโอน repo ทั้งหมดไปยังเครื่องใหม่ที่ไม่ใช่เครือข่ายซึ่งดีกว่าในรูปแบบไฟล์เดียว กำคอมไพล์ช่วยให้git fetch, git pullการดำเนินงานในรูปแบบของสภาพแวดล้อม sneakernet แต่ดูเหมือนจะสมมติว่าคุณมีรุ่นที่ทำงานของ repo บนเครื่องปลายทาง

การร้องขอที่ถูกต้องคืออะไร:

  1. Bundle ทุกสาขาใน repo ปัจจุบัน
  2. เริ่มต้น repo ใหม่บนไดเร็กทอรีปลายทางเช่นรับ root คอมมิตที่ติดตั้งอย่างถูกต้อง

ฉันได้ส่งแพตช์อัปสตรีมเพื่อชี้แจง:

`git clone` can use any bundle created without negative refspecs
(e.g., `new`, but not `old..new`).
If you want to match `git clone --mirror`, which would clone other
refs such as `refs/remotes/*`, use `--all`.
If you want to provide the same set of refs that a clone directly
from the source repository would get, use `--branches --tags` for
the `<git-rev-list-args>`.

ดังนั้น$ git bundle create repo.bundle --branches --tagsแมตช์ที่ดีที่สุดโคลน

$ git bundle create repo.bundle --all จะให้ภาพสะท้อนของเครื่องต้นทางของคุณรวมถึงการอ้างอิงระยะไกล

คำตอบ:


191

การร้องขอที่ถูกต้องคืออะไร:

  • รวมสาขาทั้งหมดใน repo ปัจจุบัน

ง่าย:

$ git bundle create repo.bundle --all

นี่repo.bundleคือชื่อของไฟล์บันเดิลที่คุณต้องการสร้าง โปรดทราบว่า--allจะไม่รวมสาขาการติดตามระยะไกล ... เช่นเดียวกับการโคลนทั่วไปจะไม่มีเช่นกัน

  • เริ่มต้น repo ใหม่บนไดเร็กทอรีปลายทางเช่นรับ root คอมมิตที่ติดตั้งอย่างถูกต้อง

อันดับแรกcloneคือแค่init+ fetch(+ ยา)

ประการที่สองคุณสามารถใช้ไฟล์บันเดิลได้ทุกที่ที่สามารถใช้ URL ที่เก็บได้ดังนั้นคุณสามารถทำได้ง่ายๆcloneจากไฟล์บันเดิล:

$ git clone repo.bundle

สิ่งนี้จะสร้างrepoเป็นที่เก็บ git


6
ขอบคุณ--allตัวเลือกไม่ได้อยู่ในหน้าคนของฉันสำหรับbundle(ฉันกำลังดูเวอร์ชัน 1.7.6.msysgit.0) และไม่ได้ใช้ไฟล์. bundle ในส่วน URL สำหรับclone. ทำให้ฉันมั่นใจมากขึ้นที่จะแนะนำการใช้งาน
Philip Oakley

20
สรุปสำหรับการสร้างgit bundle create <file> <git-rev-list-args>คำสั่ง เล่นman git-rev-list(หรือman git-log) --allจะให้คุณ แต่ฉันยอมรับว่าควรมองเห็นได้มากกว่านี้ในเอกสารคำสั่งบันเดิล
Jakub Narębski

1
ฉันเห็นว่าบันเดิล man page ภายใต้การระบุการอ้างอิงระบุว่า "จะรวมเฉพาะการอ้างอิงแพ็กเกจที่แสดงโดยgit show-ref" ซึ่งไม่รวม [list] ตัวเลือก git-rev-list
Philip Oakley

2
@ Philip Oakley: git-rev-list-argsวิธีที่คุณเลือกอ้างอิงที่แสดงโดยgit show-refคำสั่ง
Jakub Narębski

2
--allได้รวมสาขาการติดตามระยะไกลสำหรับฉัน (คอมไพล์ 2.1.4) ฉันจะได้เห็นrefs/remotes/origin/*ด้วยหรือgit bundle list-heads bundlefile git ls-remote bundlefileแม้ว่าการดึงพวกเขากลับมาจากมัดนั้นจะยุ่งยากเล็กน้อย
Alex

33

ก่อนอื่นให้โคลนที่เก็บและรวม--mirrorตัวเลือก

git clone --mirror git@example.org:path/repo.git

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

จากนั้นเรียกใช้

git bundle create repo.bundle --all ตามที่อธิบายไว้โดยคำตอบจาก Jakub Narębski


3

ผมขอแนะนำให้คุณ tar หรือซิปโฟลเดอร์ .git git reset --hard HEADและก็แกะมันในสถานที่ใหม่แล้วทำ ทุกสิ่งที่จำเป็นสำหรับสาขาทั้งหมดอยู่ภายใต้. git และสิ่งที่คุณต้องทำคือปรับรีโมทใด ๆ ในไฟล์. git / config หรือลบออก

tar cf myrepo.tgz .git
cp myrepo.tgz [USB_STICK]
... move to new machine ...
mkdir myrepo && cd myrepo
tar xpf [USB_STICK]/myrepo.tgz
git reset --hard HEAD

4
ข้อแม้อย่างหนึ่งคือคุณจะต้องดูไฟล์. git / config เพื่อตรวจสอบว่าเจ้าของ repo เดิมมีสิ่งเฉพาะของผู้ใช้อยู่ในนั้นหรือไม่
Noufal Ibrahim

@patthoyts: เนื่องจากมันถูกตัดการเชื่อมต่อจึงไม่มีรีโมท ;-) ดูเหมือนว่าบันเดิลจะ (อาจจะ) ไม่มีตัวเลือกและอาจจะโคลน (ต้องคิดเกี่ยวกับการโคลนนิ่งจากกลุ่ม)
Philip Oakley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.