มีวิธีง่ายๆในการสำรองข้อมูล git repo ทั้งหมดรวมถึงสาขาและแท็กทั้งหมดหรือไม่
มีวิธีง่ายๆในการสำรองข้อมูล git repo ทั้งหมดรวมถึงสาขาและแท็กทั้งหมดหรือไม่
คำตอบ:
มีอะไรเกี่ยวกับการสร้างโคลนของมัน?
git clone --mirror other/repo.git
ทุกที่เก็บเป็นข้อมูลสำรองของรีโมต
git branch -a
. อาจจะชัดเจนกว่าด้วยวิธีนี้: หลังจากโคลนที่เก็บคุณไม่ได้ดึงทุกสาขาคุณจะดึงข้อมูลทุกคอมมิต สาขาอ้างอิงเฉพาะการกระทำที่มีอยู่
git clone
ครอบคลุมทั้งหมดนั้น (1) เป็นทางเลือกไม่ใช่ข้อกำหนด หากผลลัพธ์ยังคงได้รับการปรับให้เหมาะสมก็ยังคงเป็นข้อมูลสำรอง (2) ที่คอมไพล์เอง - ประเด็นที่อยากจะให้คือถ้าgit clone
ครอบคลุมประเด็นที่เกี่ยวข้องแล้วคุณต้องการเครื่องมืออื่นสำหรับอะไร? แม้ว่าฉันจะชอบgit bundle
แต่ฉันก็ไม่คิดว่าคำตอบของฉันผิดหรือไม่ถูกต้อง คุณสามารถดูทั้งสองวิธีเป็นการสำรองข้อมูลแบบร้อนและแบบเย็น
git bundle
ฉันชอบวิธีนั้นเพราะส่งผลให้เกิดไฟล์เพียงไฟล์เดียวและง่ายต่อการคัดลอก
ดูProGit: มัดเล็ก ๆ น้อย ๆ ของความสุข
โปรดดูที่ " ฉันจะส่งอีเมลถึงคนอื่นในที่เก็บ git ได้อย่างไร " โดยที่คำสั่ง
git bundle create /tmp/foo-all --all
มีรายละเอียด:
git bundle
จะจัดแพ็คเกจเฉพาะการอ้างอิงที่แสดงโดยgit show-ref เท่านั้นซึ่งรวมถึงส่วนหัวแท็กและหัวรีโมต
เป็นสิ่งสำคัญมากที่พื้นฐานที่ใช้จะถูกยึดโดยปลายทาง
เป็นเรื่องปกติที่จะทำผิดพลาดเนื่องจากข้อควรระวังทำให้ไฟล์บันเดิลมีออบเจ็กต์อยู่แล้วในปลายทางเนื่องจากสิ่งเหล่านี้จะถูกละเว้นเมื่อคลายการบรรจุที่ปลายทาง
สำหรับการใช้บันเดิลนั้นคุณสามารถโคลนได้โดยระบุโฟลเดอร์ที่ไม่มีอยู่จริง (นอก git repo ใด ๆ ):
git clone /tmp/foo-all newFolder
git bundle
คือคำตอบที่ถูกต้องสำหรับความคิดเห็นของฉันไม่ใช่คำตอบที่ยอมรับ ฉันคิดว่าเขารู้คำสั่งโคลนดีถ้าเขาสามารถถามคำถามดังกล่าวได้และชัดเจนว่ามันไม่เพียงพอสำหรับเขา (เพราะมันเป็นโคลนไม่ใช่การถ่ายโอนข้อมูล) การถ่ายโอนข้อมูลเป็นสิ่งที่แตกต่างกันเช่นเดียวกับสำเนาทั่วไปตัวอย่างเช่น 1) ไม่จำเป็นต้องมีความเหมาะสม (หรือมีความสามารถ) สำหรับการทำงานปกติ 2) แต่จำเป็นต้องมีความต้านทานและการซ่อมแซมที่ดีจากความเสียหายของข้อมูล 3) มักมีประโยชน์ หากสามารถสำรองข้อมูลส่วนเพิ่มที่แตกต่างกันได้อย่างง่ายดายในขณะที่ไม่ใช่เป้าหมายในการทำสำเนา
git bundle
หรือทุกอย่างตัวอย่างเช่นสคริปต์ hook git clone
git bundle
กับ repo ระยะไกลได้หรือไม่
ขยายคำตอบอื่น ๆ นี่คือสิ่งที่ฉันทำ:
ตั้งค่า repo: git clone --mirror user@server:/url-to-repo.git
จากนั้นเมื่อคุณต้องการรีเฟรชข้อมูลสำรอง: git remote update
จากตำแหน่งโคลน
สิ่งนี้จะสำรองข้อมูลสาขาและแท็กทั้งหมดรวมถึงสาขาใหม่ที่ถูกเพิ่มในภายหลังแม้ว่าจะเป็นที่น่าสังเกตว่าสาขาที่ถูกลบจะไม่ถูกลบออกจากการโคลน (ซึ่งสำหรับการสำรองข้อมูลอาจเป็นสิ่งที่ดี)
นี่คือปรมาณูจึงไม่มีปัญหาอย่างที่สำเนาธรรมดาจะทำได้
ขยายคำตอบที่ยอดเยี่ยมโดยKingCrunchและVonC
ฉันรวมทั้งสองอย่างเข้าด้วยกัน:
git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all
หลังจากนั้นคุณมีไฟล์ที่เรียกreponame.bundle
ว่าสามารถคัดลอกได้อย่างง่ายดาย จากนั้นคุณสามารถสร้างที่เก็บ git ปกติใหม่จากการใช้งานgit clone reponame.bundle reponame
นั้น
โปรดทราบว่าgit bundle
เฉพาะสำเนาคอมมิตที่นำไปสู่การอ้างอิงบางส่วน (สาขาหรือแท็ก) ในที่เก็บ การพันกันจึงไม่ถูกเก็บไว้ในมัด
git bundle create reponame.bundle --all
?
ใช้ git bundle หรือ clone
การคัดลอกไดเร็กทอรี git ไม่ใช่วิธีแก้ปัญหาที่ดีเพราะไม่ใช่ atomic หากคุณมีที่เก็บขนาดใหญ่ที่ใช้เวลาในการคัดลอกนานและมีคนดันไปที่ที่เก็บของคุณจะส่งผลต่อการสำรองข้อมูลของคุณ การโคลนหรือทำบันเดิลจะไม่มีปัญหานี้
ทุกอย่างมีอยู่ใน.git
ไดเร็กทอรี เพียงสำรองข้อมูลพร้อมกับโครงการของคุณเช่นเดียวกับที่คุณทำกับไฟล์ใด ๆ
copy
หรือcp
คำสั่งเป็นอย่างดีและมันไม่ตรงกับความต้องการของเขา และฉันก็คิดว่าเขาคิดบนพื้นที่เก็บข้อมูลเปล่า (แม้ว่าจะสามารถคัดลอกได้เช่นกัน แต่ฉันคิดว่ามันไม่ใช่การสำรองข้อมูลที่มีคุณสมบัติครบถ้วน)
เธรดนี้มีประโยชน์มากในการรับข้อมูลเชิงลึกว่าการสำรองข้อมูล git repos สามารถทำได้อย่างไร ฉันคิดว่ามันยังขาดคำแนะนำข้อมูลหรือข้อสรุปเพื่อหา "วิธีที่ถูกต้อง" (tm) สำหรับตัวเอง ดังนั้นจึงแบ่งปันความคิดของฉันที่นี่เพื่อช่วยเหลือผู้อื่นและนำไปอภิปรายเพื่อปรับปรุงพวกเขา ขอบคุณ.
เริ่มต้นด้วยการหยิบคำถามเดิมขึ้นมา:
จากนั้นเติมเต็มด้วยความปรารถนาทั่วไปและระบุค่าที่ตั้งไว้ล่วงหน้า:
มุมมองแตกต่างจากการสำรองข้อมูล "100%" นี่คือสองคนทั่วไป
คอมไพล์เป็นเครื่องมือของนักพัฒนาและสนับสนุนมุมมองนี้ผ่านทางและgit clone --mirror
git bundle --all
git gc
)git เป็นเครื่องมือสำหรับนักพัฒนาและปล่อยให้ผู้ดูแลระบบ การสำรองข้อมูลของการกำหนดค่า git และการกำหนดค่าระบบปฏิบัติการควรแยกออกจากการสำรองข้อมูลเนื้อหา
ส่วนใหญ่เป็นข้อมูลทั่วไปสำหรับการสำรองข้อมูล
git gc --auto
git bundle --all
git bundle verify
.git clone --mirror
git fsck
.การสำรองข้อมูลเย็นสำเนาสามารถทำสำรองข้อมูลไฟล์เต็ม: ปฏิเสธทุกการเข้าถึงไปยัง Repos คอมไพล์ทำสำรองข้อมูลและอนุญาตให้เข้าถึงอีกครั้ง
การสำรองไฟล์ไม่สามารถทำได้ด้วย repos ที่ใช้งานอยู่เนื่องจากมีความเสี่ยงที่ข้อมูลจะเสียหายจากการกระทำต่อไป Hot-copy ให้สถานะคงที่ของที่เก็บที่ใช้งานอยู่เพื่อวัตถุประสงค์ในการสำรอง การกระทำต่อเนื่องไม่มีผลต่อสำเนานั้น ตามที่ระบุไว้ข้างต้นฟังก์ชันโคลนและบันเดิลของ git สนับสนุนสิ่งนี้ แต่สำหรับการสำรองข้อมูล "ผู้ดูแลระบบ 100%" จะต้องดำเนินการหลายอย่างผ่านคำสั่งเพิ่มเติม
git bundle --all
สร้างไฟล์ดัมพ์แบบเต็ม / ส่วนเพิ่มของเนื้อหาและคัดลอก / สำรองไฟล์คอนฟิกูเรชันแยกกันgit clone --mirror
จัดการและคัดลอกการกำหนดค่าแยกกันจากนั้นทำการสำรองไฟล์แบบเต็มของมิเรอร์
คุณสามารถสำรอง git repo ด้วยgit-copyที่ขนาดพื้นที่จัดเก็บขั้นต่ำ
git copy /path/to/project /backup/project.repo.backup
จากนั้นคุณสามารถกู้คืนโครงการของคุณด้วย git clone
git clone /backup/project.repo.backup project
git clone --bare
git push --force
คำตอบที่ถูกต้อง IMO เป็นคอมไพล์โคลน --mirror สิ่งนี้จะสำรองข้อมูล repo ของคุณอย่างสมบูรณ์
Git clone mirror จะโคลนที่เก็บโน้ตหัวอ้างอิง ฯลฯ ทั้งหมดและโดยทั่วไปจะใช้เพื่อคัดลอกที่เก็บทั้งหมดไปยังเซิร์ฟเวอร์ git ใหม่ สิ่งนี้จะดึงทุกสาขาและทุกอย่างลงในที่เก็บทั้งหมด
git clone --mirror git@example.com/your-repo.git
โดยปกติการโคลน repo จะไม่รวมทุกสาขาเฉพาะ Master
การคัดลอกโฟลเดอร์ repo จะ "คัดลอก" เฉพาะสาขาที่ถูกดึงเข้ามา ... ดังนั้นโดยค่าเริ่มต้นจะเป็นสาขาหลักเท่านั้นหรือสาขาอื่น ๆ ที่คุณเคยเช็คเอาต์ไว้ก่อนหน้านี้
คำสั่ง Git บันเดิลก็ไม่ใช่สิ่งที่คุณต้องการเช่นกัน: "คำสั่งบันเดิลจะรวมทุกอย่างที่ปกติจะถูกผลักผ่านสายด้วยคำสั่ง git push ลงในไฟล์ไบนารีที่คุณสามารถส่งอีเมลถึงใครบางคนหรือใส่แฟลชไดรฟ์จากนั้น เลิกรวมกลุ่มในที่เก็บอื่น " (จากความแตกต่างระหว่าง git clone --mirror และ git clone --bare คืออะไร )
cd /path/to/backupdir/
git clone /path/to/repo
cd /path/to/repo
git remote add backup /path/to/backupdir
git push --set-upstream backup master
สิ่งนี้จะสร้างการสำรองข้อมูลและทำการตั้งค่าเพื่อให้คุณสามารถกดคอมไพล์เพื่ออัปเดตข้อมูลสำรองของคุณสิ่งที่คุณต้องการทำ ตรวจสอบให้แน่ใจว่า / path / to / backupdir และ / path / to / repo เป็นฮาร์ดไดรฟ์ที่แตกต่างกันอย่างน้อยก็ไม่สมเหตุสมผลที่จะทำเช่นนั้น
มีสองตัวเลือกดังนี้
คุณสามารถใช้tarของไดเร็กทอรี git repo ได้โดยตรงเนื่องจากมีเนื้อหาเปล่าทั้งหมดของ repo บนเซิร์ฟเวอร์ มีความเป็นไปได้เล็กน้อยที่อาจมีใครบางคนกำลังทำงานกับ repo ในขณะที่ทำการสำรองข้อมูล
คำสั่งต่อไปนี้จะให้โคลนของ repo (เช่นเดียวกับในเซิร์ฟเวอร์) จากนั้นคุณสามารถใช้ tar ของตำแหน่งที่คุณโคลนได้โดยไม่มีปัญหาใด ๆ
git clone --bare {your backup local repo} {new location where you want to clone}
หากอยู่ใน Github ให้ไปที่ bitbucket และใช้เมธอด "import repository" เพื่ออิมพอร์ต github repo ของคุณเป็นที่เก็บส่วนตัว
หากอยู่ใน bitbucket ให้ทำอีกทางหนึ่ง
เป็นการสำรองข้อมูลทั้งหมด แต่ยังคงอยู่ในระบบคลาวด์ซึ่งเป็นวิธีที่ดีที่สุดของฉัน
เท่าที่ฉันรู้คุณสามารถทำสำเนาไดเร็กทอรีที่มี repo ของคุณได้แค่นั้นเอง!
cp -r project project-backup
git clone --bare
จะทำให้คุณได้ภาพรวมที่สอดคล้องกัน