ฉันจะล้างโฟลเดอร์. git ของฉันได้อย่างไร ล้างไดเรกทอรีโครงการของฉัน แต่. git ยังคงมีขนาดใหญ่


86

.git / วัตถุในรางของฉันโครงการไดเรกทอรียังคงเป็นใหญ่หลังจากลบหลายร้อยเมกะไบต์ของขยะที่สร้างขึ้นโดยไม่ได้ตั้งใจ

ฉันได้ลองgit add -Aแล้วรวมถึงคำสั่งอื่น ๆ เพื่ออัปเดตดัชนีและลบไฟล์ที่ไม่มีอยู่ ฉันรวบรวมอาจจะไม่ถูกต้องว่าไฟล์ที่มีชื่ออักขระสองตัวในไดเร็กทอรีเป็น blobs ฉันได้พยายามย้อนกลับไปที่การกระทำก่อนหน้านี้ แต่โชคไม่ดี

ฉันจะทำความสะอาดไดเร็กทอรีนี้ได้อย่างไร

คำตอบ:


139
  • หากคุณเพิ่มไฟล์และลบออกไปแล้ว Blobs ยังคงอยู่ แต่กำลังห้อยอยู่ git fsckจะแสดงรายการ blobs ที่ไม่สามารถเข้าถึงได้และgit pruneจะลบออก

  • หากคุณเพิ่มไฟล์ให้คอมมิตแล้วย้อนกลับด้วยไฟล์เหล่านั้นgit reset --hard HEAD^จะติดอยู่ลึกกว่าเล็กน้อย git fsckจะไม่แสดงรายการการกระทำที่ห้อยลงมาหรือ blobs ใด ๆ เนื่องจากreflogของสาขาของคุณถือครองไว้ นี่เป็นวิธีหนึ่งที่จะทำให้แน่ใจว่าเฉพาะวัตถุที่อยู่ในประวัติของคุณเท่านั้นที่ถูกต้องจะยังคงอยู่:

    git reflog expire --expire=now --all
    git repack -ad  # Remove dangling objects from packfiles
    git prune       # Remove dangling loose objects
    
  • อีกวิธีหนึ่งคือการโคลนที่เก็บเนื่องจากจะดำเนินการเฉพาะวัตถุที่เข้าถึงได้ อย่างไรก็ตามหากอ็อบเจ็กต์ห้อยบรรจุ (และหากคุณดำเนินการหลายอย่างคอมไพล์อาจถูกบรรจุโดยอัตโนมัติ) จากนั้นโคลนภายในจะมีไฟล์แพ็คทั้งหมด:

    git clone foo bar                 # bad
    git clone --no-hardlinks foo bar  # also bad
    

    คุณต้องระบุโปรโตคอลเพื่อบังคับให้คอมไพล์คำนวณแพ็กใหม่:

    git clone file://foo bar  # good
    

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

1
@user file://fooURL สัมพันธ์กับไดเร็กทอรีปัจจุบันและfile:///home/me/foo(สามเครื่องหมายทับ) เป็นค่าสัมบูรณ์
Josh Lee

ขอบคุณ! นั่นคือขนาดที่ถูกตัดลงครึ่งหนึ่ง แต่แพ็คของฉันยังคงมีขนาดใหญ่กว่าที่เก็บที่เหลือถึงสิบเท่า เคยลองตัดแต่งแล้ว ..
light24bulbs

1
@user หากการคอมมิตจำนวนมากมีไฟล์ขนาดใหญ่ผิดพลาดคุณอาจต้องการใช้git-filter-branchเพื่อเลือกไฟล์เหล่านั้น
Josh Lee

2
ขออภัยไม่มีผลใด ๆ หัวหน้าฝ่ายพัฒนาของฉันบอกว่าขนาดอยู่ในช่วงที่ยอมรับได้ แต่ไม่เอื้ออำนวย ถ้าคุณมีเวลาให้ช้อนป้อนอาหารฉันนั่นจะดีมาก แต่คุณทำให้ฉันกลับมายืนได้ ขอบคุณ jleedev
light24bulbs

34

คุณได้ลองใช้ไฟล์ git gcคำสั่งแล้วหรือยัง?


3
git gc --aggressive --pruneเหมาะกับฉัน git gcไม่. การตั้งค่าเริ่มต้นอาจไม่เพียงพอ
Moonlight Knight

15

Sparkleshare สร้างไฟล์ tmp_pack_ ขนาด 13GB ในคอมไพล์ของฉันหลังจากไม่สามารถดึงรูปภาพขนาดใหญ่ได้หลายครั้ง สิ่งเดียวที่ช่วยได้คือ ...

rm -f .git/objects/*/tmp_*

'git gc' ไม่ได้ลบไฟล์เหล่านั้น


นั่นเป็นวิธีแก้ปัญหาที่ดุร้าย แต่ฉันไม่เห็นเหตุผลที่มันจะไม่ได้ผล ดี!
light24bulbs

1
สถานการณ์ที่สิ้นหวังต้องการมาตรการที่สิ้นหวังมันทำงานได้อย่างมีเสน่ห์! Tks.
medina

rm สำหรับคำสั่ง linux? แล้วผู้ใช้ windows แล้ว @cat ล่ะ?
gumuruh

7

หากคุณยังคงมี repo ขนาดใหญ่หลังจากตัดแต่งกิ่งและบรรจุใหม่ ( gc --aggressive --prune=tomorrow... ) คุณสามารถค้นหาสิ่งที่แปลกออกไปได้:

git rev-list --objects --all |
    while read sha1 fname
    do 
        echo -e "$(git cat-file -s $sha1)\t$\t$fname"
    done | sort -n

สิ่งนี้จะให้รายการวัตถุที่เรียงลำดับตามขนาดจากน้อยไปหามาก คุณสามารถใช้ git-filter-branch เพื่อลบผู้ร้ายออกจาก repo ของคุณ

โปรดดู "การนำวัตถุออก" ในhttp://progit.org/book/ch9-7.htmlสำหรับคำแนะนำ


@DavidJames ขอบคุณสำหรับคำใบ้ ฉันทำให้มันอ่านง่ายขึ้น IMO
เห็นเมื่อ

เพียงในกรณีที่คนอื่นมากกว่าทริปนี้มีการพิมพ์ผิดใน args ในวงเล็บ: --aggressiveควรจะเป็น พยายามแก้ไข แต่ปรากฎว่าคุณไม่สามารถแก้ไขการพิมพ์ผิดเล็กน้อยได้
hellobenallan

@hellobenallan ขอบคุณสำหรับบันทึกแก้ไข
เห็น

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