১০.১ গিট ইন্টারনালস – প্লাম্বিং এবং পোর্সেলেইন
শুরুতেই আপনি হয়তো এই অধ্যায় টি বাদ দিয়ে গিয়েছেন, অথবা সম্পূর্ন বইটি পড়া শেষে আপনি এই অধ্যায় এ এসেছেন — যেভাবেই হোক না কেন, এই অংশের আলোচনায় আমরা এখন Git এর অভ্যন্তরীণ ক্রিয়াকলাপ সম্পর্কে জানবো। আমরা অবলোকন করেছি যে, Git এর সম্পর্কে ভালো জানতে কিংবা কেন এটি এত শক্তিশালী টুল এবং প্রশংসার যোগ্য তা বুঝার জন্য এই মৌলিক আলোচনা টি অধিক কার্যকরি। তবে এসব হয়তো নতুন দের জন্য বিভ্রান্তিকর অথবা জটিল বিষুয়বস্তুর কারণ হয়ে দাড়াতে পারে, এ নিয়ে অনেক বিভেদ রয়েছে। এইজন্য এই অধ্যায়টি আমরা এই বই এর একদম শেষের দিকে রেখেছি। আপনি শুরুতে পড়বেন কিংবা পরে পড়বেন এটা সম্পূর্ন আপনাদের উপর ছেড়ে দিলাম। যেহেতু আপনি এখানে এসেই গেছেন তাহলে শুরু করা যাক। প্রথমত, Git একটি content-addressable file-system যেটার উপরে VCS এর ইউজার ইন্টারফেস টি লিখা হয়েছে, এই বিষয় টি যদি পরিষ্কার না বুঝে থাকেন তাহলে একটু পরেই এর অর্থ বুঝতে পারবেন। Git এর প্রথমদিককার কথা, তখন ইউজার ইন্টারফেস অনেক জটিল ছিল কারণ তখন VCS এর থেকেও filesystem এর উপর অধিক গুরত্ব দেওয়া হয়েছিল। গত কয়েকবছরে UI অধিকবার পরিমার্জিত করা হয়েছে যতক্ষণ না পর্যন্ত এর UI আরো সহজে ব্যবহারযোগ্য হয়। Content-addressable file-system লেয়ার বা স্তর টি খুবি অসাধারন তাই এটি ই হবে আমাদের প্রথম আলোচ্য বিষয়বস্তু। এরপর আপনি জানবেন কিভাবে transport mechanisms এবং repository maintenance কাজ করে, এসব হয়তো আপনাকে শেষে মোকাবেলা করতে হয়তে পারে।প্লাম্বিং এবং পোর্সেলেইন
এই বইটিতে মূলত checkout, branch, remote ইত্যাদি সহ ত্রিশ টি বা ততোধিক সাবকমান্ড দিয়ে কিভাবে Git ব্যবহার করতে হয় তা নিয়ে আলোচনা করা হয়েছে। কিন্তু যেহেতু Git শুরুতে সম্পূর্ন ইউজার ফ্রেন্ডলি VCS থেকেও একটি ভার্সন কন্ট্রল সিস্টেম এর টুলকিট ছিল সেহেতু এর একদম low-level অথবা নিম্নস্তরের কাজ করে এমন কিছু সাবকমান্ড রয়েছে। এবং সে কারণে এসব সাবকমান্ড Unix মতো চেইন করে অথবা বিভিন্ন script থেকে কল করা যায় এমন ভাবে ডিজাইন করা হয়েছিল। এসব low-level সাবকমান্ড মূলত “plumbing” কমান্ড হিসেবে পরিচিত। আর ইউজার ফ্রেন্ডলি কমান্ডগুলো কে “porcelain” বলা হয়ে থাকে। আপনি এখন পর্যন্ত লক্ষ্য করেছেন, এই বইটির প্রথম নয়টি অধ্যায়ে প্রায় অধিকাংশ ক্ষেত্রেই porcelain কমান্ড এর ব্যাবহার উপস্থাপিত হয়েছে। তাই এই অধ্যায়ে আপনি low-level কমান্ড গুলো নিয়ে কাজ করবেন এতে করে Git এর অভ্যন্তরীণ কার্যকলাপ সম্পর্কে জানবেন এবং Git কেন এবং কিভাবে এসব করে তা নিয়ে ভালো ধারণা পাবেন। এরমধ্যে অনেক কমান্ড ই কমান্ডলাইনে ম্যানুয়ালী ব্যবহার করার উদ্দেশ্যে নয়, বরং নতুন টুল এবং কাস্টম স্ক্রিপ্ট তৈরির কাজে ব্যবহার করার জন্য। আপনি যখন নতুন কিংবা বিদ্যমান ডিরেক্টরি তে git init কমান্ড টি রান করবেন, তখন সেই ডিরেক্টরি তে Git একটি .git নামে ফোল্ডার অথবা ডিরেক্টরি তৈরি করে যেখানে Git যা কিছু সংরক্ষন করে কিংবা ব্যাবস্থাপনা করে তা সব থাকে। আপনার রিপোজিটরি বা ডিরেক্টরিএর ব্যাকআপ নিতে চাইলে .git ডিরেক্টরি টি অন্য কোন জায়গায় রাখলেই হবে, কারণ এতে ঐ ব্যাকআপ নেওয়া ডিরেক্টরির যাবতীয় এবং প্রয়োজনীয় সব তথ্যই বিদ্যমান থাকে। এই পুরা অধ্যায়ে .git ডিরেক্টরির ভিতরে যা যা থাকে তা নিয়েই আলোচনা করা হয়েছে। নতুন তৈরিকৃত .git ডিরেক্টটি দেখতে ঠিক এমন:
$ ls -F1
config
description
HEAD
hooks/
info/
objects/
refs/
Git এর ভার্সন এর উপর ভিত্তিতে আপনি হয়তো অতিরিক্ত কন্টেন্ট দেখতে পারেন, কিন্ত উপরে উল্লেখ্য সবই হচ্ছে একদম নতুন তৈরিকৃত .git ডিরেক্টরির কন্টেন্ট। description ফাইল টি GitWeb এর জন্য তাই এই টি নিয়ে চিন্তা করার দরকার নেই। config ফাইল টিতে প্রজেক্ট ভিত্তিক বিভিন্ন কনফিগারেশন্স থাকে। আর info/ ডিরেক্টরি তে একটা exclude ফাইল থাকে যেখান আপনি যেসব তথ্য .gitignore এ ট্র্যাক রাখতে চান না সেসব তথ্য গুলা বা তথ্যের প্যাটার্ন রাখতে পারবেন। ক্লায়েন্ট এবং সার্ভার ভিত্তিক কিচ্ছু hook স্ক্রিপ্ট থাকে hooks/ ডিরেক্টরি তে। Git Hooks এসব hook নিয়ে বিস্তারিত আলোচনা করা হয়েছে।
আর বাকি থাকে চারটি গুরুত্ত্বপূর্ন এন্ট্রি। সেগুলা হলো HEAD, index ফাইলস (এখনো তৈরি করা হয়নি), objects/ এবং refs/ ডিরেক্টরি। এগুলাই Git এর মূল অংশ। objects/ ডিরেক্টরি তে আপনার Database এর জন্য সমস্ত কন্টেন্ট গুলো সংরক্ষিত থাকে। কমিট দেওয়া তথ্য (ranches, tags, remotes ইত্যাদি) এর পয়েন্টার বা রেফারেন্স সংরক্ষিত থাকে refs/ ডিরেক্টরি তে। যে branch এ আপনি বর্তমানে চেক আউট করা অবস্থায় আছেন সেটি পয়েন্ট করে থাকে HEAD ফাইল টি। পরিশেষে, index ফাইলে Git সকল ধরনের স্টেজিং এরিয়ার তথ্য সংরক্ষন করে।