2011-03-30 24 views
12

मैं एक कस्टम गिट कमांड लिख रहा हूं जो केवल एक पूरी तरह से नए भंडार में चलना चाहिए (this question देखें)। यह देखने के लिए कि क्या मौजूदा रेपो शून्य है या नहीं, मैं अपनी स्क्रिप्ट के भीतर एक सरल जांच कैसे कर सकता हूं?मैं कैसे जांच सकता हूं कि गिट रिपोजिटरी में कोई काम करता है या नहीं?

अनिवार्य रूप से, नीचे खाली में क्या चल रहा है?

if ___________ ; then 
    echo "Git repo already has commits. Aborting. 
else 
    echo "Git repo has no commits. Doing whatever my script does." 
fi 
+2

क्या गिट लॉग कोई उपयोग होगा? –

उत्तर

21

सारांश:

  • एक प्रतिबद्ध चेक आउट किया गया है: परीक्षण git rev-parse HEAD &> /dev/null
  • एक रेफरी एक प्रतिबद्ध करने के लिए इशारा करते हुए मौजूद है: परीक्षण git rev-list -n 1 --all &> /dev/null
  • वस्तुओं रेपो में मौजूद है: git fsck की कसौटी पर उत्पादन, git count-objects, या .git/objects

और अब चर्चा के लिए सामग्री की जांच करें!

यदि आप जानना चाहते हैं कि कोई प्रतिबद्धता जांच की गई है, तो आप git rev-parse HEAD का उपयोग कर सकते हैं। आउटपुट होगा, इसलिए आप शायद /dev/null पर रीडायरेक्ट करना चाहते हैं और बस निकास कोड का उपयोग करें। सभी व्यावहारिक उद्देश्यों के लिए, यह काफी अच्छा होगा - सामान्य चीजें करना, HEAD के बिना कुछ भी इंगित करना बहुत असंभव है। लेकिन यह संभव है, उदाहरण के लिए .git निर्देशिका में फ़ाइलों को हटाकर। आपकी लिपि के आधार पर, यह महत्वपूर्ण हो सकता है - यदि आप .git निर्देशिका को उड़ाने वाले हैं, तो आप वास्तव में पागल होना चाहते हैं।

यदि आप देखना चाहते हैं कि उन पर कोई रिफ्रेंस है, तो आप git rev-list -n 1 --all का उपयोग कर सकते हैं। फिर, आउटपुट (पहली प्रतिबद्धता का SHA1 सामने आएगा), इसलिए /dev/null पर रीडायरेक्ट करें और निकास कोड देखें।

अंत में, यदि आप यह देखना चाहते हैं कि कोई भी काम करता है - भले ही वे किसी भी रेफरी पर न हों (आपको वास्तव में इस राज्य में आने के लिए कड़ी मेहनत करनी है) मैं शायद उपस्थिति की जांच करूँगा git fsck या git count-objects के साथ ऑब्जेक्ट्स - या असफल होने पर, .git/objects सूचीबद्ध करें और info और pack के अलावा कुछ भी जांचें (यदि कोई फ़ाइल .git/HEAD नहीं है तो आदेश विफल हो जाते हैं)। और हाँ, आप वास्तव में ब्लब्स और पेड़ों के साथ एक रेपो कर सकते हैं लेकिन कोई काम नहीं करता है, लेकिन आपको वहां पहुंचने के लिए और भी कठिन प्रयास करना होगा। यदि आपकी स्क्रिप्ट डरावनी है तो ये पूर्ण सुरक्षित तरीके हैं।

+3

ठीक है, यह इसे कवर करने के बारे में है। –

+0

चूंकि हम वर्तमान में इस से निपट रहे हैं, मैंने सोचा कि मुझे लगता है कि 'गिट रेव-पार्स हेड' उस मामले के प्रति संवेदनशील है जहां कोई "मास्टर" शाखा नहीं है। कम से कम मेरे अंत में 'गिट इनिट - बेयर' 'मास्टर पर हेड पॉइंटिंग के साथ एक रेपो बनाता है; लेकिन कोई भी साथ आ सकता है और किसी अन्य शाखा के नाम पर धक्का दे सकता है और स्क्रिप्ट उन्हें पहचान नहीं पाएगी (जब तक एक हुक अपडेट हेड या कुछ नहीं)। यह उत्तर में ध्यान देने योग्य मूल्य के एक सामान्य ठेठ मामले की तरह लगता है। – OEP

+0

सावधान रहें कि 'गिट एफएसके' पढ़ा नहीं गया है या इसमें काफी समय लग सकता है, और' गिट गिनती-ऑब्जेक्ट्स 'ज़ीरो की रिपोर्ट करेगा यदि केवल एक पैक है। आप पैक में कितनी ऑब्जेक्ट्स देख सकते हैं यह देखने के लिए आप 'गिट गिनती-ऑब्जेक्ट्स' को भी देख सकते हैं। – robbat2

3

आप cygwin उपयोग कर रहे हैं git log

उपयोग करना चाहते हैं या एक linux मशीन gitk पर हैं साथ ही साथ है करने के लिए एक उपयोगी कार्यक्रम है।

+0

गिट लॉग कोई त्रुटि नहीं देता है अगर कोई काम नहीं करता है। क्या आप कह रहे हैं कि मुझे गैर-शून्य रिटर्न वैल्यू को एक संकेत के रूप में समझना चाहिए कि रेपो का कोई काम नहीं है? –

+2

सही, गिट लॉग आपको एक त्रुटि देगा कि कोई 'हेड' नहीं है जिसका अर्थ है कि कुछ भी मौजूद नहीं है। इसके अलावा यदि आप 'गिट शाखा-एल' का उपयोग करते हैं तो आपको कोई परिणाम नहीं मिलेगा (और कोई त्रुटि नहीं)। यदि एक प्रतिबद्धता मौजूद थी तो एक शाखा भी मौजूद होगी (दूसरे के बिना एक नहीं हो सकता है)। – RDL

+1

हालांकि सामान्य उपयोग में यह सच है, लेकिन आप निश्चित रूप से अपनी सभी शाखाओं को उड़ाने का प्रबंधन कर सकते हैं (और अभी भी काम करते हैं) यदि आप चाहते हैं - या यदि आपने कुछ विशेष रूप से दुर्भाग्यपूर्ण खोल गलती की है। – Cascabel

संबंधित मुद्दे

 संबंधित मुद्दे