जैसा कि इस SO उत्तर में बताया गया है , git gc
वास्तव में रेपो के आकार को बढ़ा सकता है!
इस धागे को भी देखें
अब git के पास एक सुरक्षा तंत्र है जो ' ' 'रनिंग के दौरान अपरिचित वस्तुओं को तुरंत नहीं हटाता है git gc
।
डिफ़ॉल्ट रूप से अप्रतिबंधित वस्तुओं को लगभग 2 सप्ताह की अवधि के लिए रखा जाता है। यह आपके लिए गलती से हटाई गई शाखाओं या कमिट्स को पुनर्प्राप्त करना या दौड़ से बचने के लिए आसान है, जहां एक प्रक्रिया बनाई गई है, लेकिन अभी तक संदर्भित नहीं की गई git gc
प्रक्रिया समानांतर में चल रही ' ' प्रक्रिया द्वारा हटा दी जा सकती है ।
तो उस ग्रेस पीरियड को पैक्ड लेकिन अनरिफाइंड ऑब्जेक्ट्स को देने के लिए, रीपैक प्रक्रिया उन अपरिचित ऑब्जेक्ट्स को पैक से उनके ढीले रूप में धकेल देती है ताकि वे वृद्ध हो सकें और अंत में प्राउड हो सकें।
अप्रतिबंधित होने वाली वस्तुएं आमतौर पर इतनी अधिक नहीं होती हैं। 404855 अप्रतिबंधित वस्तुएँ होना बहुत अधिक है, और क्लोन के माध्यम से उन वस्तुओं को पहली जगह पर भेजना बेवकूफी है और नेटवर्क बैंडविड्थ की पूरी बर्बादी है।
वैसे भी ... अपनी समस्या को हल करने के लिए, आपको बस उस ग्रेस पीरियड को निष्क्रिय करने git gc
के --prune=now
तर्क के साथ ' ' चलाने की जरूरत है और उन अप्रतिबंधित वस्तुओं से तुरंत छुटकारा पाएं (केवल तभी सुरक्षित रहें जब कोई अन्य कार्य नहीं हो रहा हो कार्य केंद्र पर सुनिश्चित करना आसान हो)।
और BTW, git gc --aggressive
बाद के गिट संस्करण के साथ ' ' का उपयोग कर (या ' git repack -a -f -d --window=250 --depth=250
')
एक ही सूत्र का उल्लेख है :
git config pack.deltaCacheSize 1
यह 0 के डिफ़ॉल्ट के बजाय डेल्टा कैश आकार को एक बाइट (प्रभावी रूप से अक्षम करना) तक सीमित करता है जिसका अर्थ है असीमित। इसके साथ मैं 486 git repack
RAM के साथ x86-64 सिस्टम पर उपर्युक्त कमांड का उपयोग करके और 4 थ्रेड्स (यह एक क्वाड कोर है) का उपयोग करके उस रिपॉजिटरी को वापस करने में सक्षम हूं । निवासी स्मृति उपयोग लगभग 3.3GB तक बढ़ता है।
यदि आपकी मशीन एसएमपी है और आपके पास पर्याप्त रैम नहीं है, तो आप थ्रेड्स की संख्या केवल एक तक कम कर सकते हैं:
git config pack.threads 1
इसके अतिरिक्त, आप मेमोरी उपयोग --window-memory argument
को ' git repack
' तक सीमित कर सकते हैं ।
उदाहरण के लिए, --window-memory=128M
डेल्टा खोज मेमोरी के उपयोग पर एक उचित ऊपरी सीमा का उपयोग करना चाहिए , हालांकि इसके परिणामस्वरूप कम इष्टतम डेल्टा मैच हो सकता है यदि रेपो में बहुत सारी फाइलें होती हैं।
फ़िल्टर-शाखा के मोर्चे पर, आप इस स्क्रिप्ट पर (सावधानी से) विचार कर सकते हैं
#!/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