গিট ইন্টার্নালগুলি ব্যবহার করে এটি কেন চ্যালেঞ্জিং সমস্যা তা আমাকে এক্সপ্লোর করতে দিন। আপনি এর মাধ্যমে বর্তমান কমিটের 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 এবং দ্বিতীয়টি কমিট সময় time
এখন কমিটের সময়টি সহজেই বার্তাটি পরিবর্তন করে এবং নির্দিষ্ট সময়ে প্রতিশ্রুতিবদ্ধ হতে কমিটিকে সময় নির্ধারণ করতে বা সময় নির্ধারণ করতে কত সময় লাগে তা অনুমান করে সহজেই যত্ন নেওয়া হয়। আসল সমস্যাটি হ'ল ট্রি শ 1, যা থেকে আপনি তা পেতে পারেন git ls-tree $(git write-tree) | git mktree
। মূলত আপনি এলএস-ট্রি থেকে প্রাপ্ত বার্তায় একটি sha1 চেকসাম করছেন যা সমস্ত ফাইল এবং তাদের sha1 চেকসামের একটি তালিকা।
সুতরাং আপনার কমিট শ 1 চেকসাম আপনার গাছের শ 1 চেকসামের উপর নির্ভর করে, যা সরাসরি ফাইল শ 1 চেকসামের উপর নির্ভর করে যা বৃত্তটি সম্পূর্ণ করে এবং কমিট শ 1 এর উপর নির্ভর করে। সুতরাং আপনার নিজের কাছে আমার কাছে উপলব্ধ প্রযুক্তিগুলির সাথে একটি বিজ্ঞপ্তি সমস্যা রয়েছে।
সঙ্গে কম নিরাপদ চেকসাম , এটা সম্ভব দেখানো হয়েছে পাশব বল মাধ্যমে ফাইল নিজেই মধ্যে ফাইলের চেকসাম লিখতে; তবে, sha1 দিয়ে সেই কাজটি সম্পন্ন করে এমন কোনও কাজ আমি জানি না। এটি অসম্ভব নয়, তবে আমাদের বর্তমান বোঝাপড়ার সাথে অসম্ভবের পরেও (তবে কে জানেন যে কয়েক বছরের মধ্যে এটি ক্ষুদ্র হবে)। যাইহোক, এটি এখনও জোর করা শক্ততর কারণ যেহেতু আপনাকে ফাইলের মধ্যে একটি (বৃক্ষ) চেকসামের (বৃক্ষ) চেকসামের (কমিট) চেকসামটি লিখতে হবে।