2013-01-08 42 views
7

0/किसी अन्य प्रतिबद्धता के पहले या बाद में एक गिट प्रतिबद्धता की जांच की गई थी, तो एक चीज जिसे मैं svn का उपयोग करने के बारे में याद करता हूं, संशोधन संख्याओं की सरल संख्या थी। मैं आसानी से देख सकता हूं कि परीक्षण वातावरण में तैनात संस्करण एक निश्चित प्रतिबद्धता से पहले या उसके बाद है या नहीं।पता लगाएं कि हैश

अपने काम के लिए हैश का उपयोग करके गिट के साथ, यह बताने का एक तरीका क्या है कि कोई प्रतिबद्धता किसी अन्य प्रतिबद्धता से पहले या उसके बाद की गई थी?

उत्तर

7

चीजें, जैसा कि आप नोट करते हैं, गिट में इतना आसान नहीं हैं। विशेष रूप से, "पहले" और "बाद" की परिभाषा को थोड़ा और स्पष्टीकरण की आवश्यकता होती है।

यदि आप अपने भंडार में आने वाले लोगों पर भरोसा करते हैं तो टाइमस्टैम्प के साथ गड़बड़ न करें, और आप पहले से ही जानते हैं कि दोनों काम एक ही शाखा में हैं, तो आप काम के टाइमस्टैम्प की तुलना कर सकते हैं और देख सकते हैं कि पहले कौन सा है। प्रत्येक प्रतिबद्धता के लिए निम्न आदेश का प्रयोग करें, और परिणाम की तुलना करें।

git log -1 --format='%ci' <commit> 
Git के साथ

यह आवश्यक नहीं, timestamps भरोसा नहीं कर सकते, फिर भी विपरीत सबवर्सन उनके उत्पादन की एक नौकरी के साथ एक केंद्रीय भंडार नहीं है, क्योंकि। आप यह भी सुनिश्चित नहीं कर सकते कि दो काम एक ही शाखा पर हैं (हालांकि समस्या भी सबवर्जन के साथ मौजूद है)।

उन समस्याओं से बचने के लिए, इस बारे में बात करें कि कोई प्रतिबद्धता किसी अन्य का पूर्वज है या नहीं, इसके पहले या उसके बाद आता है।निम्नलिखित प्रतिबद्ध ग्राफ में, बी और सी, ए के पूर्वजों हैं, जबकि बी सी के एक पूर्वज है और न ही इसके विपरीत नहीं है:

B (master) 
| C (branch) 
|/ 
A (root) 

यह निर्धारित करने के लिए प्रतिबद्ध एक बी, निम्न आदेश का उपयोग के एक पूर्वज है (करने के लिए an article at git ready के आधार पर):

git rev-list <commitA> | grep $(git rev-parse <commitB>) 

पहले भाग सूचियों सभी करता है कि एक प्रतिबद्ध के पूर्वजों कर रहे हैं; दूसरा भाग प्रतिबद्ध बी के पूर्ण हैश प्राप्त करता है, फिर उस प्रतिबद्धता के लिए पूर्वजों की सूची की खोज करता है। यदि आप कोई आउटपुट देखते हैं, तो प्रतिबद्ध ए प्रतिबद्धता बी का पूर्वज है। अगर प्रतिबद्धता ए प्रतिबद्धता बी के पूर्वजों है तो कार्य करने के लिए तर्कों को स्वैप करें।

यह दूसरा रूप धीमा है, लेकिन आपको पूर्ण निश्चितता देता है कि एक प्रतिबद्धता दूसरे का पूर्वज होता है।

+0

तो क्या टाइमस्टैम्प का प्रतिनिधित्व करता है जब मैं Git लॉग करना -1 --format = '% ci' ? मैं बस एक परिदृश्य को समझने की कोशिश कर रहा हूं जब मैं टाइमस्टैम्प पर भरोसा नहीं कर सकता। – Glide

+0

@ ग्लाइड: वह टाइमस्टैम्प प्रतिबद्धता के समय का प्रतिनिधित्व करता है। हालांकि, क्योंकि शुरुआत शुरुआत में डेवलपर के स्थानीय भंडार पर की जाती है, अगर उनके कंप्यूटर पर घड़ी गलत है, या वे 'GIT_COMMITTER_DATE' के साथ खेलने की तरह एक चाल का उपयोग करते हैं, तो टाइमस्टैम्प गलत हो सकता है। –

+0

हे, कमांड काम करता है लेकिन आपने यह कैसे कहा है कि यह कैसे काम करता है गलत है। गिट रेव-लिस्ट कमांड वास्तव में यह निर्धारित करता है कि प्रतिबद्ध बी प्रतिबद्धता ए का पूर्वज है या नहीं। आप कहते हैं कि "पहला भाग सभी प्रतिबद्धताओं को सूचीबद्ध करता है जो प्रतिबद्धता ए के पूर्वजों हैं"। जो कुछ स्पष्ट रूप से करता है, मैंने अभी कुछ परीक्षण किए हैं। इसलिए यदि आप SHA प्रतिबद्धता के लिए उस सूची के माध्यम से grepping कर रहे हैं, तो grep सफलता होगा IFF प्रतिबद्ध बी उस पूर्वजों की सूची में है, यानी प्रतिबद्धता ए के पूर्वजों - जो आपने लिखा है उसके विपरीत। – eeeeaaii

0

आप टैग का उपयोग करते हैं आप कर

git describe --tags 

यह आपको बता कितने पिछले टैग के बाद से प्रतिबद्ध जाएगा कर सकते हैं।

2

प्रतिबद्धता की तारीख खोजने के लिए प्रत्येक प्रतिबद्धता पर git show का उपयोग करें। ऑर्डर निर्धारित करने के लिए हैश को देखकर कोई रास्ता नहीं है, क्योंकि यह हैश के अलावा कुछ भी नहीं है।

आप जो भी चाहते हैं उसे दिखाने के लिए कस्टम प्रारूप स्ट्रिंग का उपयोग कर सकते हैं, अधिक जानकारी के लिए man pages देखें।

git show --format="%ci" <commit> 
2

आप सभी लॉग जो हैश, लेखक, दिनांक से पता चलता से जानकारी के लिए प्रतिबद्ध प्राप्त कर सकते हैं, और टिप्पणी:

git log 

आप खींच सकते हैं एक विशिष्ट प्रतिबद्ध प्रतिबद्ध लॉग से के समय/तारीख। कुछ की तरह:

git log -1 --format="%cd" <commit> 

'% सीडी' आप लॉग के प्रारूप में तिथि देता है, तो आप भी कर सकते हैं:

  • % CD: RFC2822 शैली
  • % करोड़: रिश्तेदार
  • % सीटी: यूनिक्स टाइमस्टैम्प
  • % ci: आईएसओ 8601 प्रारूप

वहाँ से, यो यदि आपको स्वचालित करने की आवश्यकता है तो आप कुछ स्क्रिप्टिंग के साथ कुछ तुलना कर सकते हैं।

3

git rev-list --count सहायता कर सकते हैं। मान 110a187 आता है 4 प्रतिबद्ध 5d41af1 से पहले, तो:

$ git rev-list --count 110a187..5d41af1 
4 
$ git rev-list --count 5d41af1..110a187 
0 

इस प्रकार की तरह कुछ:

test $(git rev-list --count $a..$b) == 0 && \ 
     echo "$a is not an ancestor of $b" 
+0

यदि @ ग्लाइड का अर्थ अस्थायी के बजाय माता-पिता/वंशज है, तो यह उत्तर उस स्थिति में अधिक सटीक है जहां काम विभिन्न शाखाओं से विलय के माध्यम से शाखा में आया था। –

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