git prune क्या है?
git prune कमांड का उपयोग लोकल रिपॉजिटरी से उन ऑब्जेक्ट्स को हटाने के लिए किया जाता है जिनकी अब आवश्यकता नहीं है। ये ऑब्जेक्ट्स कमिट्स, ट्रीज़ (डायरेक्टरी स्नैपशॉट), ब्लॉब्स (फाइलें) और टैग्स हो सकते हैं जो रिपॉजिटरी में किसी भी ब्रांच या टैग से अब सुलभ नहीं हैं।
सरल शब्दों में, git prune रिपॉजिटरी में अनावश्यक फाइलों और डेटा को साफ करने में मदद करता है, जिससे स्पेस बचती है और अव्यवस्था घटती है।
ऑब्जेक्ट्स अप्राप्य कैसे हो जाते हैं?
ऑब्जेक्ट्स कई तरीकों से अप्राप्य हो सकते हैं—उदाहरण के लिए, ब्रांचों को हटाना या कमिट्स को फिर से लिखना। जब ब्रांचें हटाई जाती हैं, तो उन ब्रांचों के विशिष्ट कमिट्स जो किसी अन्य ब्रांच या टैग का हिस्सा नहीं हैं, अप्राप्य बन जाते हैं।
कमिट्स को फिर से लिखना, जैसे git rebase जैसे कमांड्स से, नए कमिट्स बनाता है और पुराने कमिट्स को हटा देता है, जिससे वे भी अप्राप्य हो जाते हैं।
ग्रेस पीरियड और रिफलॉग्स
Git ब्रांच टिप्स और अन्य रेफरेंसेज़ में हुए अपडेट्स का एक लॉग रखता है जिसे रिफलॉग (reference logs) कहते हैं। हम इसे git reflog कमांड से देख सकते हैं।
भले ही कोई ऑब्जेक्ट अप्राप्य हो, यदि वह अभी भी रिफलॉग में है, तो git prune उसे डिलीट नहीं करेगा।
डिफ़ॉल्ट रूप से, रिफलॉग की समाप्ति अवधि 90 दिन होती है, जो एक ग्रेस पीरियड देती है जिसमें अप्राप्य ऑब्जेक्ट्स अस्थायी रूप से सुरक्षित रहते हैं और तुरंत प्रून नहीं किए जाते।
git prune का उपयोग कब करें
आम तौर पर, हमें सीधे git prune का उपयोग करने की आवश्यकता नहीं होती। Git में एक गार्बेज कलेक्शन तंत्र है जो कुछ कमांड्स के बाद स्वतः चलकर अनावश्यक फाइलों को साफ करता है और कुछ फाइलों को कंप्रेस करके लोकल रिपॉजिटरी की कार्यक्षमता को बेहतर बनाता है।
फिर भी, हम कुछ स्थितियों में रिपॉजिटरी को मैन्युअल रूप से साफ करना चाह सकते हैं, जैसे:
- ऐसी कार्रवाई के बाद जो हमें पता है कि अप्राप्य ऑब्जेक्ट्स बनाएगी, जैसे किसी ब्रांच को हटाना।
- जब हम तुरंत डिस्क स्पेस साफ करना चाहते हों।
- रिपॉजिटरी को हमेशा सुव्यवस्थित और साफ़ रखना।
git gc के साथ गार्बेज कलेक्शन
सीधे प्रून करने के बजाय, आमतौर पर गार्बेज कलेक्शन तंत्र पर भरोसा करने की सलाह दी जाती है, जो न केवल git prune चलाता है बल्कि ऑब्जेक्ट्स को कंप्रेस करके स्पेस का अनुकूलन भी करता है।
जैसा कि ऊपर बताया गया, गार्बेज कलेक्शन कुछ कमांड्स के बाद स्वतः चल जाएगा। हम इसे मैन्युअल रूप से भी निम्न कमांड से चला सकते हैं:
git gc
git prune का उपयोग कैसे करें
क्योंकि git prune डेटा डिलीट करता है, इसे पहले --dry-run विकल्प के साथ चलाने की सलाह दी जाती है।
git prune --dry-run
यह विकल्प उन ऑब्जेक्ट्स की सूची दिखाएगा जिन्हें प्रून किया जाएगा, बिना वास्तव में उन्हें हटाए। आउटपुट कुछ इस तरह दिखेगा:
0d7dff8258654c03a058987b3e63c86feca9200d commit
ea1380f52f0bfa0142e46767adfd56593681091a blob
fa91af78a1ab453c1d7632192b3ca8bf217ec711 commit
यह आउटपुट बताता है कि दो कमिट्स और एक ब्लॉब अप्राप्य हैं और हटाए जाएंगे। यह सुनिश्चित करने के बाद कि कोई महत्वपूर्ण डेटा सूचीबद्ध नहीं है, हम क्लीनअप आगे बढ़ा सकते हैं:
git prune
कुछ स्थितियों में, हम किसी ऐसी कार्रवाई के तुरंत बाद रिपॉजिटरी को साफ़ करना चाहेंगे जिसके कारण अप्राप्य ऑब्जेक्ट्स बनने वाले हों, जैसे ब्रांच हटाना। हम git prune --dry-run चलाएँ, लेकिन आउटपुट खाली आए। इसका कारण यह है कि हटाए गए कमिट्स अभी भी रिफलॉग में संदर्भित हैं।
यदि हम रिफलॉग से उनके स्वतः समाप्त होने का इंतज़ार नहीं करना चाहते, तो हम उन्हें निम्न कमांड से मैन्युअल रूप से समाप्त कर सकते हैं:
git reflog expire --expire-unreachable=now --all
आइए उपयोग किए गए विकल्पों को समझें:
- विकल्प
--expire-unreachable=nowसभी अप्राप्य ऑब्जेक्ट्स की समाप्ति तिथि “अभी” सेट करता है, यानी उन्हें तुरंत समाप्त मानता है। - विकल्प
--allरिपॉजिटरी के सभी रिफलॉग एंट्रीज़ को टार्गेट करता है। इस विकल्प के बिना, हमें किसी विशेष रेफरेंस (जैसे ब्रांच या टैग) को निर्दिष्ट करना पड़ता।
git prune: उन्नत उपयोग
आइए कुछ उन्नत तकनीकों पर नज़र डालें, जैसे एक्सपायरी समय निर्दिष्ट करना या पैक्ड फाइलों को प्रून करना।
एक्सपायरी समय निर्दिष्ट करना
हम केवल पुराने अप्राप्य ऑब्जेक्ट्स को साफ़ करना चाह सकते हैं, जैसे केवल वे ऑब्जेक्ट्स प्रून करना जो कम से कम दो सप्ताह पुराने हों।
विकल्प --expire <time> हमें एक कटऑफ समय निर्दिष्ट करने देता है। Git उन ऑब्जेक्ट्स को हटाएगा जो निर्दिष्ट समय से अधिक समय तक अप्राप्य रहे हैं। <time> पैरामीटर विभिन्न प्रारूप स्वीकार करता है जैसे "2 weeks ago", "3 days", "yesterday" आदि, जिससे अवधि बताने में लचीलापन मिलता है।
उदाहरण कमांड:
git prune --expire=2.weeks.ago
पैक्ड फाइलों को प्रून करना
Git मुख्यतः दो तरीकों से ऑब्जेक्ट्स स्टोर करता है: अलग-अलग फाइलों के रूप में (loose objects) और पैक्ड फाइलों में। पैकिंग एक ऐसा तंत्र है जो कई ऑब्जेक्ट्स को एक ही फाइल में रखकर और दोहराव हटाकर स्पेस बचाता है तथा प्रदर्शन बेहतर करता है।
कभी-कभी, कोई ऑब्जेक्ट loose और packed दोनों रूपों में मौजूद हो सकता है। यह दोहराव हानिकारक नहीं है (थोड़ा अतिरिक्त डिस्क स्पेस लेने के अलावा), फिर भी हम उन loose ऑब्जेक्ट्स को साफ़ करना चाह सकते हैं जो पहले से पैक्ड भी हैं ताकि स्पेस वापस मिल सके।
कमांड git prune-packed उन loose ऑब्जेक्ट्स को हटाता है यदि वे पहले से किसी पैक में शामिल हैं। git prune के विपरीत, git prune-packed --expire <time> जैसे किसी विकल्प को स्वीकार नहीं करता। यह बस उन loose ऑब्जेक्ट्स को साफ करता है जो पहले से पैक्ड हैं।
निष्कर्ष
जैसे-जैसे हम किसी रिपॉजिटरी का उपयोग करते हैं, कुछ ऑब्जेक्ट्स अप्राप्य हो जाते हैं, जिससे अनावश्यक डिस्क उपयोग बढ़ता है। Git इसे एक गार्बेज कलेक्शन प्रणाली के ज़रिए प्रबंधित करता है जो निष्क्रियता के कुछ समय बाद अप्राप्य ऑब्जेक्ट्स को हटा देती है।
गार्बेज कलेक्शन तंत्र Git द्वारा कुछ कमांड्स के बाद स्वतः चलाया जाता है। लेकिन हम इसे git gc कमांड का उपयोग करके मैन्युअल रूप से भी चला सकते हैं। गार्बेज कलेक्शन प्रक्रिया न केवल git prune के जरिए अप्राप्य ऑब्जेक्ट्स हटाती है बल्कि कुछ ऑब्जेक्ट्स को कंप्रेस करके डिस्क स्पेस का भी अनुकूलन करती है।
उन्नत Git उपयोगकर्ता रिपॉजिटरी को मैन्युअल रूप से साफ़-सुथरा रखना चाह सकते हैं। git prune कमांड अप्राप्य ऑब्जेक्ट्स के मैन्युअल हटाने की सुविधा देता है। हमें हमेशा git prune चलाने से पहले git prune --dry-run चलाना चाहिए, ताकि प्रूनिंग प्रक्रिया के दौरान हटाए जाने वाले ऑब्जेक्ट्स का अवलोकन मिल सके।

Git का डेटा हटाने के प्रति सुरक्षात्मक रुख महत्वपूर्ण कमिट्स या डेटा के आकस्मिक नुकसान को रोकता है।
हालाँकि, इससे कुछ पुराना डेटा, जैसे हटाई गई ब्रांचों के संदर्भ, दिखाई देते रह सकते हैं। समय के साथ, Git रिपॉजिटरीज़ में ऐसे ऑब्जेक्ट्स जमा हो सकते हैं जिनका कोई संदर्भ नहीं होता, जो अनावश्यक डिस्क स्पेस लेते हैं और संभावित रूप से भ्रम पैदा करते हैं।
git pruneकमांड Git के भीतर एक हाउसकीपिंग यूटिलिटी है, जिसका मुख्य उद्देश्य रिपॉजिटरी में मौजूद अप्राप्य ऑब्जेक्ट्स को साफ करना है।एक अप्राप्य ऑब्जेक्ट वह है जो किसी भी ब्रांच, टैग, रिमोट-ट्रैकिंग ब्रांच या अन्य संदर्भ द्वारा सुलभ नहीं है। ये ऑब्जेक्ट्स रिपॉजिटरी में जगह घेरते हैं और समय के साथ इसे अनावश्यक डेटा से अव्यवस्थित कर सकते हैं।
हालाँकि
git pruneरिपॉजिटरीज़ को कॉम्पैक्ट रखने का एक शक्तिशाली साधन है, अधिकांश उपयोगकर्ताओं को इसे सीधे चलाने की ज़रूरत नहीं पड़ती क्योंकि Git का स्वचालित गार्बेज कलेक्शन (git gc) यह काम कर देता है। फिर भी, उन्नत Git उपयोगकर्ताओं के लिए या कुछ विशिष्ट परिस्थितियों में जहाँ मैन्युअल रिपॉजिटरी रखरखाव आवश्यक या वांछनीय हो, इसके रोल और फ़ंक्शन को समझना उपयोगी रहता है।