গিট আসলে "ডেল্টাস সমাধান করে" বলার পরে কি করছে?


187

কোনও সংগ্রহস্থলের প্রথম ক্লোন চলাকালীন গিট প্রথমে বস্তুগুলি গ্রহণ করে (যা যথেষ্ট পরিমাণে সুস্পষ্ট) এবং তারপরে "রেজোলিউজিং ডেল্টাস" প্রায় একই পরিমাণ সময় ব্যয় করে। ক্লোনটির এই পর্যায়ে আসলে কী ঘটছে?



1
: এছাড়াও দেখ, গীত 2.20 (Q4 ই 2018) এবং আরও অনেক কিছু ব-দ্বীপ দ্বীপ জন্য stackoverflow.com/a/52458712/6309
VonC

উত্তর:


54

গিট কিছু বস্তুকে প্যাকফাইলে সংরক্ষণ করার জন্য ডেল্টা এনকোডিং ব্যবহার করে । যাইহোক, যদি আপনি না ফিরে প্রতিটি পরিবর্তন খেলতে করতে চান কি কখনো অর্ডার বর্তমান সংস্করণটি পেতে একটি প্রদত্ত ফাইলে, তাই গীত এছাড়াও পাশাপাশি সংরক্ষণ করা ফাইলের বিষয়বস্তু অনিয়মিত স্ন্যাপশট হয়েছে। "সমাধান ডেল্টাস" হ'ল এমন পদক্ষেপ যা নিশ্চিত করে যে সমস্ত কিছুই ধারাবাহিক থাকে।

অনলাইনে উপলব্ধ প্রো গিট বইয়ের "গিট ইন্টারনাল" বিভাগের একটি অধ্যায় এখানে এই বিষয়ে কথা বলেছে।


80
এই উত্তরটি ভুল। এটি বর্ণনা করে মনে হয় মারকিউরিয়াল কীভাবে কাজ করে, গিটের মতো নয়। এটি গুগল অনুসন্ধানে এই ইস্যুটির অনুসন্ধান করছে যাতে আমি উত্তর দেওয়ার প্রয়োজন অনুভব করি। গিট কমেন্টের মধ্যে পার্থক্যগুলি ডেল্টাস হিসাবে সংরক্ষণ করে না ; গিট একটি "পুরো অবজেক্ট" স্টোর। যেমন, গিটের কোনও প্রদত্ত ফাইল দেখানোর জন্য "স্ন্যাপশট" লাগবে না কারণ ডেল্টাস থেকে ফাইলের ইতিহাস পুনর্নির্মাণের প্রয়োজন নেই। মার্চুরিয়াল এভাবেই কাজ করে।
নেক্সাস

12
একমাত্র জায়গা যেখানে ডেল্টা এনকোডিং প্লে হয় তা প্যাক ফাইলে রয়েছে যা সংকোচনের ও স্থানান্তরের জন্য কঠোরভাবে হয় - এটি গিট বিশ্বকে কীভাবে "দেখায়" তা পরিবর্তিত করে না। ( kernel.org/pub/software/scm/git/docs/v1.6.2.3/technical/… ) সঠিক প্রতিক্রিয়ার জন্য দয়া করে নীচে আরাকনিডের উত্তর দেখুন।
নেক্সাস

4
সমস্ত "স্ন্যাপশট" এর অর্থ এই প্রসঙ্গে ডেল্টা-এনকোড সংস্করণ না করে একটি ফাইলের রাজ্যের সম্পূর্ণ অনুলিপি। যেমনটি আপনি উল্লেখ করেছেন, গিট প্যাকফাইলে ডেল্টা-এনকোডিং ব্যবহার করে । কেউ বলেনি যে এটি "গিট বিশ্বকে কীভাবে দেখে" পরিবর্তিত হয় "; দয়া করে আপনার নিজের অনুমানগুলি থামানো বন্ধ করুন।
আম্বর

2
আপনার উত্তরটি এখনও সঠিক নয়। "গিটের মাঝে মাঝে সংরক্ষণ করা ফাইল সামগ্রীর স্ন্যাপশটও রয়েছে।" - এটা সঠিক নয়। "'ডেল্টাজের সমাধান' এমন এক পদক্ষেপ যা সেগুলির সমস্ত ধারাবাহিক থাকে তা নিশ্চিত করার বিষয়ে কাজ করে।" - এটিও সঠিক নয়, নীচে আরাকনিডের প্রতিক্রিয়াটি সঠিক।
নেক্সাস

1
উপরে উল্লিখিত অধ্যায়ে বর্ণিত হিসাবে, গিট সর্বদা সর্বদা সর্বশেষ সংস্করণটির সম্পূর্ণ ফাইল সামগ্রী সংরক্ষণ করে। পূর্ববর্তী সংস্করণগুলি যখন "আলগা" ফাইল হয় তখন ডেল্টা কোডেড ফাইল হিসাবে সংরক্ষণ করা হয়। পর্যায়ক্রমে (হয় কল করে git gcবা যখনই গিট এটি প্রয়োজনীয় নির্ধারণ করে) গিট স্থান সংরক্ষণের জন্য সমস্ত "আলগা" ফাইলকে একটি প্যাকফাইলে সংকুচিত করবে এবং সেই প্যাকফাইলে একটি সূচক ফাইল তৈরি হবে। সুতরাং জিলিব তার নিজস্ব ডেল্টা অ্যালগরিদম দিয়ে সংকোচিত করবে তবে গিট পূর্ববর্তী সংস্করণগুলি সংরক্ষণ করতে ডেল্টা-এনকোডিং ব্যবহার করে না। যেহেতু সর্বাধিক সাধারণ এবং ঘন ঘন অ্যাক্সেস সর্বশেষতম সংস্করণ, এটি স্ন্যাপশট হিসাবে সঞ্চিত।
ব্রায়ানস

118

এর পর্যায়গুলি হ'ল git clone:

  1. রেপো ডাটাবেসের সমস্ত বস্তুর একটি "প্যাক" ফাইল পান
  2. প্রাপ্ত প্যাকটির জন্য একটি সূচক ফাইল তৈরি করুন
  3. মাথাটি পুনর্বিবেচনা পরীক্ষা করুন (স্পষ্টতই একটি নন-বেয়ার রেপোর জন্য)

"রেজলভিং ডেল্টাস" হ'ল বার্তাটি দ্বিতীয় পর্বের জন্য দেখানো হয়েছে, প্যাক ফাইলটিকে সূচক করে ("গিট ইনডেক্স-প্যাক")।

প্যাক ফাইল না না তাদের মধ্যে প্রকৃত বস্তু আইডি, শুধুমাত্র বস্তু কন্টেন্ট আছে। সুতরাং অবজেক্ট আইডি কী তা নির্ধারণ করতে, গিটকে প্যাকের প্রতিটি অবজেক্টের ডিসকপ্রেস + এসএএএ 1 করতে হবে যা আইডিকে আইডি তৈরি করতে হবে, যা পরে সূচী ফাইলটিতে লেখা হয়।

একটি প্যাক ফাইলে থাকা কোনও বস্তু ব-দ্বীপ হিসাবে সংরক্ষণ করা হতে পারে অর্থাৎ কিছু অন্যান্য অবজেক্টে পরিবর্তনগুলির ক্রম। এই ক্ষেত্রে, গিটকে বেস অবজেক্টটি পুনরুদ্ধার করতে হবে, আদেশগুলি প্রয়োগ করতে হবে এবং ফলাফলটি SHA1 করতে হবে। বেল্ট কমান্ডের ক্রম প্রয়োগ করে বেস অবজেক্টটি নিজেই উত্পন্ন হতে পারে। (যদিও কোনও ক্লোনর ক্ষেত্রে, বেস অবজেক্টটি ইতিমধ্যে মুখোমুখি হবে, কতগুলি উত্পাদিত বস্তু স্মৃতিতে ক্যাশে রয়েছে তার সীমা রয়েছে)।

সংক্ষেপে, "রিলিজিং ডেল্টাস" পর্যায়ে পুরো রেপো ডাটাবেসটি সংক্ষেপিত করে এবং চেকসাম্পিং করা জড়িত, এতে অবাক হওয়ার মতো কিছুটা সময় লাগে না। সম্ভবত SHA1 গুলি সংক্ষেপণ এবং গণনা করতে ডেল্টা কমান্ড প্রয়োগ করার চেয়ে বেশি সময় নেয়।

পরবর্তী সময় আনার ক্ষেত্রে, প্রাপ্ত প্যাক ফাইলটিতে অন্যান্য বস্তুর সাথে রেফারেন্স (ডেল্টা অবজেক্ট বেস হিসাবে) থাকতে পারে যা প্রাপ্তি গিটটি ইতিমধ্যে প্রত্যাশিত। এই ক্ষেত্রে, প্রাপ্ত গিটটি আসলে এই জাতীয় কোনও রেফারেন্সযুক্ত বিষয় অন্তর্ভুক্ত করার জন্য প্রাপ্ত প্যাক ফাইলটি পুনরায় লেখায় যাতে কোনও সঞ্চিত প্যাক ফাইলটি স্বয়ংসম্পূর্ণ হয়। এটিই হতে পারে যেখানে "সমাধানকারী ডেল্টাস" বার্তাটির উদ্ভব হয়েছিল।


7
এটি কি সমান্তরাল হতে পারে?
ব্রুকসপিপি

এই ডেল্টা সংক্ষেপণটি কি এক জেলিব ডেটা স্ট্রিমে একাধিক অবজেক্টগুলি সঞ্চয় করার চেয়ে বেশি?
ফুজ

1
@FUZxxl হ্যাঁ, এটি দুটি ব্লফের তুলনা করতে এবং একটি সম্পাদনা স্ক্রিপ্ট তৈরি করতে ডিফ বা এক্সডেল্টার মতো অ্যালগরিদম ব্যবহার করছে
আরাকনিড

@ ব্রুকসবিপি: কেবল সীমাবদ্ধতার সাথে। কারণ 103fa49 আইডির আইটেমটি ডিকোড করার জন্য df85b51 প্রয়োজন হতে পারে, তবে আপনি যখন 103fa49 পাবেন তখন df85b51 এখনও নেই (প্যাক ফাইলগুলি sha1 হ্যাশ দ্বারা কঠোরভাবে আদেশ করা হয়েছে)। সুতরাং, কেবলমাত্র যে জিনিসগুলি ইতিমধ্যে সেখানে রয়েছে সেগুলি উল্লেখ করে, সবকিছু সহজ, তবে অন্য কিছুর জন্য আপনাকে এটি পাওয়ার আগ পর্যন্ত অপেক্ষা করতে হবে। এবং এই ডেল্টা সংকোচনে বাসা বেঁধে রাখা যেতে পারে, সুতরাং 103fa49 এর 4e9ba42 প্রয়োজন হতে পারে যার পরিবর্তে 29ad945 দরকার যা ঘুরে c9e645a দরকার ... আপনি ছবিটি পেয়ে যান। [হ্যাঁ, আমি লক্ষ্য করেছি এটি> 4 বছর;)]
বোডো থিয়েসন

2
@ ব্রুকসবিপি: দেখা যাচ্ছে, আমি ভুল ছিলাম, প্যাক ফাইলটি sha1 হ্যাশ দ্বারা বাছাই করার দরকার নেই। এছাড়াও, লেখার সময়, গিট গৌণ প্রয়োজনীয় বস্তুগুলির পূর্বে প্রয়োজনীয় বস্তুগুলি লেখেন। সুতরাং, আসলে আপনি এটি সমান্তরাল করতে সক্ষম হওয়া উচিত। কেবল অসুবিধা থেকে যায়: কারণ আপনি জানেন না যে আপনার পরে কোন জিনিসগুলির প্রয়োজন হবে, তাই আপনাকে বারবার কিছুটা পুনরায় তৈরি করতে হবে। এখানে দেখুন: kernel.org/pub/software/scm/git/docs/technical/…
বোডো থিয়েসন

4

অ্যাম্বারটি মার্কুরিয়াল বা অনুরূপ ব্যবহারকারী অবজেক্টের মডেলটি বর্ণনা করছে বলে মনে হচ্ছে। গিট কোনও বস্তুর পরবর্তী সংস্করণগুলির মধ্যে ডেল্টা সংরক্ষণ করে না, বরং প্রতিবারই বস্তুর পুরো স্ন্যাপশট। এরপরে এটি ডেল্টা সংকোচনের সাহায্যে এই স্ন্যাপশটগুলি সংকুচিত করে, ইতিহাসে যেখানে রয়েছে তা নির্বিশেষে ব্যবহার করার জন্য ভাল ডেল্টা সন্ধান করার চেষ্টা করছে।


5
প্রকৃতপক্ষে, যদিও গিট looseিলে .ালা জিনিস সংরক্ষণ করতে পারে এগুলি অগত্যা সবসময় যেমন সংরক্ষণ করা হয় না - ততই .িলে objectsালা বস্তু মুছে ফেলা যায় এবং প্যাকযুক্ত সামগ্রী দিয়ে প্রতিস্থাপন করা যায়। আমি মনে করি না যে অ্যাম্বারের উত্তর পরবর্তী সংস্করণগুলি সম্পর্কে কোথাও কিছু বলেছিল।
আলব্লিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.