วิธีการย่อขนาดโฟลเดอร์. git


134

ฐานปัจจุบันของฉันมีขนาดโดยรวมประมาณ 200MB

แต่โฟลเดอร์. git ของฉันมีขนาด 5GB (!) เนื่องจากฉันส่งงานของฉันไปยังเซิร์ฟเวอร์ภายนอกฉันจึงไม่ต้องการประวัติท้องถิ่นที่ยิ่งใหญ่

ฉันจะย่อขนาดโฟลเดอร์. git เพื่อเพิ่มพื้นที่ว่างบนโน้ตบุ๊กได้อย่างไร ฉันสามารถลบการเปลี่ยนแปลงทั้งหมดที่เก่ากว่า 30 วันได้หรือไม่

ขอบคุณมากสำหรับความช่วยเหลือ :)


2
คุณสามารถโพสต์ผลลัพธ์ของgit count-objects -v?
CB Bailey

2
เป็นไปได้ที่จะซ้ำกันของขนาดที่เก็บลด git
sds

คำตอบ:


113

คุณไม่ควรลบการเปลี่ยนแปลงทั้งหมดที่เก่ากว่า 30 วัน (ฉันคิดว่ามันเป็นไปได้ที่จะใช้ประโยชน์จาก git แต่ไม่แนะนำจริงๆ)

คุณสามารถโทรgit gc --aggressive --pruneได้ซึ่งจะดำเนินการรวบรวมขยะในที่เก็บของคุณและตัดวัตถุเก่า คุณมีไฟล์ไบนารีจำนวนมาก (ไฟล์เก็บถาวรรูปภาพไฟล์ปฏิบัติการ) ที่เปลี่ยนแปลงบ่อยไหม สิ่งเหล่านี้มักจะนำไปสู่โฟลเดอร์. git ขนาดใหญ่ (อย่าลืมว่า git เก็บสแนปช็อตสำหรับการแก้ไขแต่ละครั้งและไฟล์ไบนารีบีบอัดไม่ดี)


32
ที่จริงgit gc --aggressiveถือว่าเป็นการปฏิบัติที่ไม่ดี git repack -a -d --depth=250 --window=250ดีกว่าที่จะใช้
Artefact2

18
@knittl: อย่างแน่นอน นี่คือข้อความของ Linus เอง: gcc.gnu.org/ml/gcc/2007-12/msg00165.html
Artefact2

3
@ artefact2: ขอบคุณสำหรับลิงค์! ฉันได้อ่านแล้วและ linus ชี้ให้เห็นว่า --aggressive จะไม่ใช้ซ้ำ (ดี) เดลต้าซึ่งดูเหมือนจะไม่มีอยู่ในคำถามนี้เนื่องจากพื้นที่เก็บข้อมูลมีขนาดใหญ่ การบรรจุหีบห่อจะใช้เวลานานกว่ามาก git gc --aggressiveเรียก repack ด้วยขนาดหน้าต่าง 250 (cf. manpage) และความลึก 250 (cf. source code) --aggressive เพิ่ม-fสวิตช์เพิ่มเติมเพื่อทิ้งและทำซ้ำการดำเนินการเดลต้าก่อนหน้านี้ทั้งหมด (ตามที่ระบุไว้ในลิงก์)
knittl

1
ฉันเพิ่งตรวจสอบhg.nginx.org/nginx repo (RELEASE-1.4.0 เป็นคำแนะนำ) โดยใช้ git-remote-hg และสิ่งนี้ให้ repo ประมาณ 100MB การใช้git gc --aggressive --pruneทำให้ลงเหลือ 19MB
Lekensteyn

15
@ Artefact2 ของคุณคำสั่งล้าสมัย : หมายเหตุวิธีการเดิมที่โพสต์ ในความเป็นจริงในวันเดียวกันกับที่มีการโพสต์การสนทนาในรายชื่อผู้รับจดหมายส่งผลให้เกิดข้อตกลงนี้: [.. ] ดังนั้นพารามิเตอร์การบรรจุจึงเหมือนกันสำหรับวิธีใดวิธีหนึ่งในทุกวันนี้ . --pruneก็ไม่จำเป็นเช่นกันเนื่องจากกลายเป็นค่าเริ่มต้นตั้งแต่v1.5.5-rc0(กระทำ25ee973 , มีนาคม 2551)
Lekensteyn

68

นี่คือสิ่งที่ผู้สร้าง git Linusพูดเกี่ยวกับวิธีลดขนาด repo คอมไพล์ของคุณ:

เทียบเท่ากับ "git gc --aggressive" - ​​แต่ทำ * อย่างถูกต้อง * - คือทำ (ค้างคืน) อย่างเช่น

   git repack -a -d --depth=250 --window=250

โดยที่ความลึกนั้นเกี่ยวกับว่าโซ่เดลต้าสามารถอยู่ได้ลึกเพียงใด (ทำให้มันยาวขึ้นสำหรับประวัติศาสตร์เก่า - มันคุ้มค่ากับพื้นที่เหนือศีรษะ) และหน้าต่างก็คือหน้าต่างออบเจ็กต์ขนาดใหญ่ที่เราต้องการให้ผู้สมัครเดลต้าแต่ละตัวสแกน

และที่นี่คุณอาจต้องการเพิ่มแฟล็ก "-f" (ซึ่งก็คือ "ปล่อยเดลต้าเก่าทั้งหมด" เนื่องจากตอนนี้คุณกำลังพยายามทำให้แน่ใจว่าอันนี้พบผู้สมัครที่ดีจริง

แหล่งที่มา: http://gcc.gnu.org/ml/gcc/2007-12/msg00165.html

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


สำหรับฉันโฟลเดอร์. git มีขนาดประมาณ 1.5G ฉันลองสิ่งนี้ แต่ฉันพบข้อผิดพลาดที่ตามมา fatal: Out of memory, malloc failed (tried to allocate 39763130 bytes)
Miron

2
หลังจากดำเนินการแบบrepackโลคัลแล้วทำการคอมมิตและพุชจะทำให้การย่อขนาดรีโมตด้วยหรือไม่
Timo

@David Dehghan: เฮ้ฉันลองสิ่งนี้จากไดเร็กทอรีโปรเจ็กต์ แต่ขนาดของโฟลเดอร์. git ไม่เปลี่ยนแปลง เป็นไปตามที่คาดไว้หรือฉันต้องกดเพื่อดูการเปลี่ยนแปลง (ขออภัยไม่ค่อยมีประสบการณ์เกี่ยวกับคอมไพล์) ฉันมีรูปภาพ / gif ใน repo และฉันยอมรับรูปแบบที่แตกต่างกันหลายครั้งและฉันคิดว่ามันจะเพิ่มขนาด. git
giorgim

สวัสดีน่าเสียดายที่ตอนนี้คุณล้างไบนารีเวอร์ชันเก่าแล้ว ในการทำเช่นนั้นคุณต้องเขียนประวัติของคุณใหม่ซึ่งมีความซับซ้อนจริงๆ คำแนะนำสำหรับคุณมีดังนี้: docs.microsoft.com/en-us/azure/devops/articles/…
David Dehghan

22

ฉันลองสิ่งเหล่านี้ แต่ที่เก็บของฉันยังมีขนาดใหญ่มาก ปัญหาคือฉันได้ตรวจสอบโดยไม่ได้ตั้งใจในไฟล์ขนาดใหญ่ที่สร้างขึ้น หลังจากการค้นหาบางครั้งฉันพบบทช่วยสอนที่ยอดเยี่ยมซึ่งทำให้ง่ายต่อการลบไฟล์ขนาดใหญ่ที่สร้างขึ้น บทช่วยสอนนี้อนุญาตให้ฉันย่อขนาดพื้นที่เก็บข้อมูลจาก 60 MB เป็น <1 MB

Steve Lorek วิธีลดขนาดที่เก็บ Git


4
นี่คือเวอร์ชันที่เก็บถาวรในกรณีที่ลิงก์เน่า คำตอบนี้ / เป็นประโยชน์สำหรับ repo ที่ฉันพบโดยที่ไฟล์. exe และ. zip ถูกกำหนดซึ่งทำให้ขนาดของโฟลเดอร์. git
พอง

9

5GB เทียบกับ 200MB เป็นเรื่องแปลก ลองวิ่งดูgit gcครับ

แต่ไม่เว้นแต่คุณจะแยกที่เก็บของคุณเป็นโมดูลคุณจะไม่สามารถลดขนาดของ.gitไดเร็กทอรีได้

การโคลนแต่ละ git repo เป็นที่เก็บเต็มรูปแบบที่สามารถทำหน้าที่เป็นเซิร์ฟเวอร์ได้ นั่นเป็นหลักการพื้นฐานของการควบคุมเวอร์ชันแบบกระจาย


3

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

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


1
คุณสามารถใช้ Dropbox สำหรับกรณีการใช้งานนี้แทนได้ ผมทำมาหลายปี
จอนนี่

0

ลองใช้วิธีการข้างต้นไม่มีอะไรได้ผลในกรณีของฉัน (ซึ่งฉันบังเอิญฆ่ากระบวนการคอมไพล์ในระหว่างการพุชคอมไพล์) ดังนั้นในที่สุดฉันก็ต้องลบ repo และโคลนอีกครั้งและตอนนี้โฟลเดอร์. git มีขนาดปกติ


ฉันต้องใช้วิธีแก้ปัญหาเดียวกันเพราะดิสก์ของฉันเต็ม (.git โฟลเดอร์> 90 GB) ดังนั้นฉันจึงไม่สามารถเรียกใช้ repack หรือ git gc ได้!
Fl4v
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.