मैं एक गिट कोर्स पर काम कर रहा हूं और उल्लेख करना चाहता हूं कि git gc
चलाने तक खोए गए रेफरी वास्तव में खो नहीं गए हैं। लेकिन यह सत्यापित करते हुए, मुझे पता चला कि यह मामला नहीं है। git gc --prune=all --aggressive
चलाने के बाद भी खोए गए रेफरी अभी भी वहां हैं।जब गिट प्रिंस ऑब्जेक्ट्स वास्तव में करता है: "गिट जीसी" क्यों नहीं निकलता है?
स्पष्ट रूप से मैंने कुछ गलत समझा। और पाठ्यक्रम में कुछ गलत कहने से पहले, मैं अपने तथ्यों को सीधे प्राप्त करना चाहता हूं!
#!/bin/bash
git init
# add 10 dummy commits
for i in {1..10}; do
date > foo.txt
git add foo.txt
git commit -m "bump" foo.txt
sleep 1
done;
CURRENT=$(git rev-parse HEAD)
echo HEAD before reset: ${CURRENT}
# rewind
git reset --hard HEAD~5
# add another 10 commits
for i in {1..10}; do
date > foo.txt
git add foo.txt
git commit -m "bump" foo.txt
sleep 1
done;
यह स्क्रिप्ट, 10 डमी करता जोड़ने अतीत में 5 प्रतिबद्ध करने के लिए रीसेट और एक अन्य 10 प्रतिबद्ध जोड़ देगा: यहाँ एक उदाहरण स्क्रिप्ट प्रभाव दिखाता है। रीसेट करने से ठीक पहले, यह इसके वर्तमान हेड के हैश को प्रिंट करेगा।
मैं git gc --prune=all
चलाने के बाद CURRENT
में वस्तु खोने के लिए उम्मीद करेंगे। फिर भी, मैं अभी भी हैश पर git show
चला सकता हूं।
मुझे समझ में आता है कि git reset
चलाने और नई प्रतिबद्धताओं को जोड़ने के बाद, मैंने अनिवार्य रूप से एक नई शाखा बनाई है। लेकिन मेरी मूल शाखा में अब कोई संदर्भ नहीं है, इसलिए यह git log --all
में दिखाई नहीं देता है। मुझे लगता है कि किसी भी रिमोट पर भी धक्का नहीं दिया जाएगा।
git gc
की मेरी समझ उन वस्तुओं को हटा दी गई थी। प्रतीत नहीं होता यही मामला होगा।
क्यों? और जब वास्तव में git gc
वस्तुओं को हटाता है?
आपके रीफ्लॉग में अभी भी "हटाए गए" काम करने के संदर्भ शामिल हैं। उन टाइमआउट तक या आप उन्हें स्पष्ट रूप से समाप्त कर देते हैं, वे छेड़छाड़ नहीं करेंगे। – twalberg
दिलचस्प। मैंने https://git-scm.com/docs/git-reflog पर एक नज़र डाली है और 'git reflog --expire = all' चलाया है। जिसके बाद वस्तु * अभी भी * थी। इसके बाद मैंने एक और 'जीसी' चलाया और यह अभी भी वहां था। यहां तक कि एक और 'git gc - आक्रामक --prune = all' मदद नहीं की। – exhuma
आपको '--expire = all --all' की आवश्यकता है, या इसे 'HEAD' (डिफ़ॉल्ट) और' मास्टर' दोनों पर चलाने के लिए। या आप विशिष्ट प्रविष्टियों को मैन्युअल रूप से हटा सकते हैं (या नीचे उत्तर देखें)। – torek