มีวิธีการลดขนาดของโฟลเดอร์คอมไพล์หรือไม่?


156

ดูเหมือนว่าโครงการของฉันเริ่มใหญ่ขึ้นcommit/pushเรื่อยๆ ทุกคอมไพล์ มีวิธีการล้างโฟลเดอร์ git ของฉันหรือไม่?

คำตอบ:


214

ฉันไม่แน่ใจว่าคุณต้องการอะไร แน่นอนก่อนอื่นทุกครั้งที่คุณคอมมิชชัน / ผลักดันไดเร็กตอรี่จะใหญ่ขึ้นเล็กน้อยเนื่องจากมันจะต้องเก็บคอมมิทเพิ่มเติมแต่ละอันไว้

อย่างไรก็ตามคุณอาจต้องการgit gcที่จะ "ล้างไฟล์ที่ไม่จำเป็นและเพิ่มประสิทธิภาพพื้นที่เก็บข้อมูลท้องถิ่น" ( หน้าคู่มือ )

อีกคำสั่งที่เกี่ยวข้องอาจเป็นgit cleanซึ่งจะลบไฟล์ที่ไม่ได้ติดตามจากต้นไม้ของคุณ ( หน้าคู่มือ )


30
git clean -d -f -x ลบไฟล์ที่อยู่ในรายการ. gitignore และอื่น ๆ เช่นพื้นที่ทำงานที่ไม่ได้อยู่ในคอมไพล์โฟลเดอร์พ็อด ฯลฯ
Kalle

102
WARNINGคำสั่งตามที่เขียนไว้ข้างต้นโดย @Kalle จะลบทุก> ที่ไม่ได้ติดตาม <ไฟล์และไดเรกทอรีภายในของคุณ GIT ROOT , ไม่เพียงแค่ "ไฟล์ที่ระบุไว้ใน .gitignore" สิ่งใดก็ตามที่ไม่ได้รับการติดตามโดย Git ไม่ว่าจะมีการระบุไว้หรือไม่ก็ตาม.gitignoreจะถูกลบทิ้ง git clean -dfX(หมายเหตุกรณีในX) จะลบรายการที่มีกฎที่เกี่ยวข้อง.gitignoreเท่านั้น โปรดฟังคำเตือนนี้ ไม่เคยเรียกใช้git cleanโดยไม่ต้องทำงานทั้งในโหมดโต้ตอบกับ-iแทน-fหรืออย่างน้อยการทำแห้งครั้งแรก - และจากนั้นอีกครั้งกับ-n -f
Adrian Günter

5
หรือทำการสำรองข้อมูล :-)
Mateen Ulhaq

61

วิ่ง:

git remote prune origin

ลบสาขาการติดตามเก่าทั้งหมดที่ถูกลบไปแล้วoriginแต่ยังคงมีให้บริการในremotes/originเครื่อง

git gc --auto

' G arbage C ollection' - เรียกใช้งานการดูแลทำความสะอาด (บีบอัดการแก้ไขลบวัตถุที่หลวม / ไม่สามารถเข้าถึงได้) การ--autoตั้งค่าสถานะก่อนกำหนดว่างานใด ๆ ที่จำเป็นและออกโดยไม่ต้องทำอะไรถ้าไม่


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

28

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

อีกอันหนึ่งคือไฟล์ที่คุณมีไฟล์จำนวนมากภายในหนึ่ง repo (ซึ่งเป็นขีด จำกัด ของคอมไพล์ ) แทนที่จะเป็น subrepos จำนวนมาก ( จัดการเป็น submodules )

ในบทความเกี่ยวกับพื้นที่คอมไพล์ AlBlue กล่าวถึง:

โปรดทราบว่า Git (และ Hg และ DVCS อื่น ๆ ) ประสบปัญหาที่มีการตรวจสอบไบนารี (ใหญ่) แล้วลบเนื่องจากจะยังปรากฏในที่เก็บและใช้พื้นที่แม้ว่าจะไม่เป็นปัจจุบัน .

หากคุณมีไบนารีขนาดใหญ่เก็บไว้ใน repo git ของคุณคุณอาจพิจารณา:

  • การจัดการไบนารีผู้ที่อยู่ในพื้นที่เก็บข้อมูลภายนอก
  • จัดการขนาด repo .git ของคุณ
  • ลองและลบไบนารีเหล่านั้นออกจากประวัติของคุณด้วยgit filter-branch (คำเตือน: สิ่งนี้จะเขียนประวัติใหม่ซึ่งไม่ดีถ้าคุณผลัก repo ของคุณไปแล้วและถ้ามีคนอื่นดึงออกมาจากมัน)

ดังที่ฉันกล่าวถึงใน " ข้อ จำกัด ของไฟล์ใน Git (จำนวนและขนาด) คืออะไร " ยิ่งล่าสุด (2015 5 ปีหลังจากคำตอบนี้) Git LFSจาก GitHub เป็นวิธีที่จะจัดการกับไฟล์ขนาดใหญ่เหล่านั้น (โดยการจัดเก็บพวกเขานอกที่เก็บ Git)


1
การสนับสนุนไฟล์ขนาดใหญ่ git มีประโยชน์ถ้าคุณมีไฟล์ไบนารีขนาดใหญ่ (เช่นภาพ) การเพิ่ม / อัปเดตเป็นประจำ ดูgit-lfs.github.com ใช้งานง่ายสุด ๆ รองรับโดย github สมาชิกทุกคนในทีมจะต้องติดตั้งมันเพื่อใช้งานร่วมกัน
Eric Woods

@EricWoods True ฉันพูดถึง Git-LFS มาก่อน (64 ครั้ง: stackoverflow.com/search?tab=newest&q=user%3a6309%20git-lfs ) ฉันได้แก้ไขคำตอบเก่านี้แล้ว
VonC

ฮะแน่นอน! ขำขันว่าคำตอบอายุ 9 ปีขึ้นไปยังคงมีความเกี่ยวข้องอย่างไร (และตอนนี้มากยิ่งขึ้นด้วยข้อมูล LFS)
Eric Woods

22

ใช่git gcเป็นทางออกโดยธรรมชาติ

และในเครื่อง - คุณสามารถลบที่เก็บในเครื่องแล้วโคลนอีกครั้ง

แต่มีบางอย่างสำคัญกว่าที่นี่ ...

วินาทีที่คุณรอให้คอมไพล์ขนาดใหญ่ & ภายนอกประมวลผลถูกรวบรวมเป็นเวลานานซึ่งจะถูกรวบรวมเป็นชั่วโมงที่ไม่มีเวลาใช้งาน

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

แต่เมื่ออยู่ใน code-world มันไม่ใช่เวลาที่จะมีอารมณ์อ่อนไหวไม่มีจุดลากตลอดทั้ง 5 ปีของรหัสทุกการกระทำหรือ diff คุณยังสามารถเก็บ git & externals เก่าที่ไหนสักแห่งถ้าคุณคิดถึง:]

แต่ในบางจุดคุณต้องย้ายไป:]

ทีมของคุณจะขอบคุณ!


12
เห็นด้วยอย่างสมบูรณ์เมื่อเร็ว ๆ นี้เราได้ใช้วิธีการนี้ด้วยพื้นที่เก็บข้อมูลเก่าและยังไม่ได้มองกลับไป; ส่วนใหญ่เป็นเพราะเราทำไม่ได้ แต่คุณรู้ว่าฉันหมายถึงอะไร :)
WhatIsHeDoing

13

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

git reflog expire --expire=now --all && git gc --prune=now --aggressive

มันจะลบไฟล์ทั้งหมดที่ git ใช้ในการกู้คืนพื้นที่เก็บข้อมูลของคุณจากคำสั่งที่ไม่ดีบางอย่างเช่นถ้าคุณทำgit reset --hardคุณมักจะสามารถกู้คืนไฟล์ที่หายไป แต่ถ้าคุณทำgit reset --hardก่อนgit reflog expire...คำสั่งคุณก็สูญเสียทุกอย่าง ตอนนี้ความหวังเดียวของคุณคือการใช้เครื่องมือบางอย่างที่วิเคราะห์ระบบไฟล์ของคุณและพยายามกู้คืนไฟล์ที่ถูกลบหากไม่ได้ถูกแทนที่


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

10

git clean -d -f -i เป็นวิธีที่ดีที่สุดที่จะทำ

ซึ่งจะช่วยในการทำความสะอาดในลักษณะที่ควบคุมได้มากขึ้น

-i ย่อมาจากการโต้ตอบ


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

git clean -d -x -f ทำงานได้ดีหากคุณต้องการทำความสะอาดอย่างล้ำลึก
Rishabh Jain

2

ไม่ทราบว่ามันจะย่อขนาดหรือไม่ แต่หลังจากฉันรันgit cleanฉันมักจะทำgit repack -adเช่นนั้นซึ่งจะลดจำนวนไฟล์แพ็ค


5
การหีบห่อใหม่เป็นส่วนหนึ่งของgit gcกระบวนการดังนั้นไม่จำเป็นต้องเรียกใช้แยกต่างหาก
artkoshelev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.