मुझे यह पता लगाने दें कि यह गिट इंटर्नल का उपयोग करके एक चुनौतीपूर्ण समस्या क्यों है। आप कर सकते हैं वर्तमान के sha1 द्वारा प्राप्त करें
#!/bin/bash
commit=$(git cat-file commit HEAD) #
sha1=($((printf "commit %s\0" $(echo "$commit" | wc -c); echo "$commit") | sha1sum))
echo ${sha1[0]}
अनिवार्य रूप से आप द्वारा दिए गए संदेश पर एक sha1 चेकसम चलाते हैं git cat-file commit HEAD
। जब आप इस संदेश की जांच करते हैं तो दो चीजें तुरंत एक समस्या के रूप में सामने आती हैं। एक पेड़ शा 1 है और दूसरा प्रतिबद्ध समय है।
अब संदेश को बदलकर और यह अनुमान लगाने में आसानी से प्रतिबद्ध समय का ध्यान रखा जाता है कि किसी विशिष्ट समय पर प्रतिबद्ध होने के लिए प्रतिबद्ध या शेड्यूल करने में कितना समय लगता है। सच्चा मुद्दा पेड़ sha1 है, जिसे आप प्राप्त कर सकते हैंgit ls-tree $(git write-tree) | git mktree
। अनिवार्य रूप से आप ls-tree के संदेश पर एक sha1 चेकसम कर रहे हैं, जो सभी फाइलों और उनके sha1um की सूची है।
इसलिए आपका कमिटमेंट sha1 चेकसम आपके ट्री sha1 चेकसम पर निर्भर करता है, जो सीधे फाइल sha1 चेकसम पर निर्भर करता है, जो सर्कल को पूरा करता है और कमिट sha1 पर निर्भर करता है। इस प्रकार आपके पास स्वयं के लिए उपलब्ध तकनीकों के साथ एक परिपत्र समस्या है।
साथ कम सुरक्षित चेकसम , यह संभव दिखाया गया है जानवर बल के माध्यम से फ़ाइल में ही फाइल की जांच योग लिखने के लिए; हालाँकि, मुझे किसी भी कार्य का पता नहीं है जो उस कार्य को sha1 के साथ पूरा करता है। यह असंभव नहीं है, लेकिन हमारी वर्तमान समझ के साथ असंभव के बगल में है (लेकिन जो जानते हैं कि शायद कुछ वर्षों में यह तुच्छ हो जाएगा)। हालाँकि, फिर भी यह बल पर लगाम लगाने के लिए और भी कठिन है क्योंकि आपको फ़ाइल में a (blob) चेकसम के a (ट्री) चेकसम को (कमिट) चेकसम लिखना है।