ตามที่ระบุไว้ในคำตอบดังนั้นนี้ ,git gc
จริงสามารถเพิ่มขนาดของธุรกรรมซื้อคืนที่!
ดูกระทู้นี้ด้วย
ตอนนี้ git มีกลไกความปลอดภัยที่จะไม่ลบวัตถุที่ไม่ได้อ้างอิงทันทีเมื่อเรียกใช้ ' git gc
'
โดยค่าเริ่มต้นวัตถุที่ไม่ได้อ้างอิงจะถูกเก็บไว้ประมาณ 2 สัปดาห์ นี่คือการทำให้ง่ายสำหรับคุณในการกู้คืนสาขาหรือคอมมิตที่ถูกลบโดยไม่ได้ตั้งใจหรือเพื่อหลีกเลี่ยงการแข่งขันที่วัตถุที่เพิ่งสร้างขึ้นในระหว่างการเป็น แต่ยังไม่ได้อ้างอิงสามารถลบได้โดย 'git gc
กระบวนการ '' ที่ทำงานควบคู่กันไป
ดังนั้นเพื่อให้ช่วงเวลาผ่อนผันนั้นแก่วัตถุที่บรรจุ แต่ไม่ได้รับการอ้างอิงกระบวนการบรรจุหีบห่อจะผลักวัตถุที่ไม่ได้อ้างอิงเหล่านั้นออกจากแพ็คให้อยู่ในรูปแบบหลวม ๆ เพื่อให้มีอายุและถูกตัดแต่งในที่สุด
วัตถุที่ไม่ถูกอ้างอิงมักจะมีไม่มากนัก การมีวัตถุที่ไม่ได้อ้างอิงถึง 404855 นั้นค่อนข้างมากและการส่งวัตถุเหล่านั้นในตอนแรกผ่านทางโคลนนั้นโง่และเสียแบนด์วิดท์เครือข่ายโดยสิ้นเชิง
อย่างไรก็ตาม ... ในการแก้ปัญหาของคุณคุณเพียงแค่เรียกใช้ ' git gc
' ด้วย--prune=now
อาร์กิวเมนต์เพื่อปิดใช้งานช่วงเวลาผ่อนผันนั้นและกำจัดวัตถุที่ไม่ได้อ้างอิงเหล่านั้นทันที (ปลอดภัยเฉพาะในกรณีที่ไม่มีกิจกรรมคอมไพล์อื่น ๆ เกิดขึ้นในเวลาเดียวกันซึ่งควร มั่นใจได้ง่ายบนเวิร์กสเตชัน)
และ BTW โดยใช้ ' git gc --aggressive
' กับ git เวอร์ชันที่ใหม่กว่า (หรือ ' git repack -a -f -d --window=250 --depth=250
')
หัวข้อเดียวกันกล่าวถึง :
git config pack.deltaCacheSize 1
ซึ่ง จำกัด ขนาดเดลต้าแคชไว้ที่หนึ่งไบต์ (ปิดใช้งานได้อย่างมีประสิทธิภาพ) แทนที่จะเป็นค่าเริ่มต้นของ 0 ซึ่งหมายถึงไม่ จำกัด ด้วยเหตุนี้ฉันจึงสามารถบรรจุที่เก็บใหม่ได้โดยใช้git repack
คำสั่งด้านบนบนระบบ x86-64 ที่มี RAM 4GB และใช้ 4 เธรด (นี่คือ Quad Core) การใช้หน่วยความจำของผู้อยู่อาศัยเพิ่มขึ้นเป็นเกือบ 3.3GB
หากเครื่องของคุณเป็น SMP และคุณมี RAM ไม่เพียงพอคุณสามารถลดจำนวนเธรดให้เหลือเพียงเธรดเดียว:
git config pack.threads 1
นอกจากนี้คุณสามารถ จำกัด การใช้งานหน่วยความจำเพิ่มเติมได้ด้วยการ--window-memory argument
" git repack
"
ตัวอย่างเช่นการใช้--window-memory=128M
ควรให้ขอบเขตบนที่เหมาะสมกับการใช้หน่วยความจำการค้นหาเดลต้าแม้ว่าจะทำให้การจับคู่เดลต้าที่เหมาะสมน้อยลงหาก repo มีไฟล์ขนาดใหญ่จำนวนมาก
ที่ด้านหน้าสาขาตัวกรองคุณสามารถพิจารณา (ด้วยความระมัดระวัง) สคริปต์นี้
#!/bin/bash
set -o errexit
# Author: David Underhill
# Script to permanently delete files/folders from your git repository. To use
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2
if [ $# -eq 0 ]; then
exit 0
fi
# make sure we're at the root of git repo
if [ ! -d .git ]; then
echo "Error: must run this script from the root of a git repository"
exit 1
fi
# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD
# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all && git gc --aggressive --prune