৪.১ সার্ভারে গিট – প্রটোকলস

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

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

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

রিমোট রিপোসিটোরি সাধারণত bare repository —অর্থাৎ একটি গিট্ রিপোসিটরি যাতে কোনো ওয়ার্কিং ডিরেক্টরি থাকে না। যেহেতু এই রিপোসিটোরি শুধুমাত্র একটি কোলাবোরেশন পয়েন্ট হিসাবে ব্যবহৃত হয় তাই ডিস্কে কোনো স্ন্যাপশট চেকআউট করার প্রয়োজন নেই;এটি শুধুমাত্র একটি গিট্ ডাটা। সহজ কথায় বেয়ার রিপোসিটোরি আপনার প্রজেক্টের গিট্ (.git) ডিরেক্টরি ছাড়া অন্য কিছু নয়।

প্রটোকলস

গিট্ এর মাধ্যমে ডেটা ট্রান্সফার করতে চারটি প্রোটোকল ব্যবহৃত হয়।লোকাল প্রোটোকল,এইচটিটিপি প্রোটোকল,এসএসএইচ প্রোটোকল,গিট্ প্রোটোকল ।এখানে আমরা পরিস্থিতির উপর নির্ভর করে কখন কোন প্রোটোকল ব্যবহার করবো বা কখন করবোনা সে সম্পর্কে আলোচনা করবো।

লোকাল প্রোটোকল

প্রোটোকল সমূহের মধ্যে সবচেয়ে মৌলিক প্রোটোকল হচ্ছে লোকাল প্রোটোকল।এখানে রিপোসিটোরি গুলিকে একই হোস্ট এর বিভিন্ন ডিরেক্টরিতে রাখা যায়। যদি আপনার টীম এর প্রত্যেকের জন্য একটি ফাইল শেয়ার করেন যেমন নাকি NFS মাউন্ট অথবা সব কিছু একটি কম্পিউটারে থাকে । কিন্তু সব কোড রিপোসিটোরি একই কম্পিউটারে থাকলে যেকোনো বিপর্যয়ে ক্ষতির সম্ভাবনা বেশি থাকে বিধায় এটি করা ঠিক নয়।

আপনার যদি একটি শেয়ার্ড করা মাউন্টেড ফাইল সিস্টেম থাকে তবে আপনি একটি লোকাল ফাইল-বেসড রিপোসিটোরি থেকে ক্লোন,পুশ এবংপুল পারবেন।কোনো রিপোসিটোরি ক্লোন বা এক্সিস্টিং কোনো প্রজেক্টকে রিমোটে অ্যাড করতে রিপোসিটোরির পাথকে ইউআরএল হিসেবে ব্যবহার করতে হবে। উদাহরণ স্বরূপ কোনো কিছু ক্লোন করতে আপনি এইরূপ কিছু রান করতে হবে।
				
					
$ git clone /srv/git/project.Git
				
			
অথবা আপনি এইটাও করতে পারেন :
				
					$ git clone file:///srv/git/project.git
				
			
যদি আপনি স্পষ্টভাবে file:// ইউআরএল এর শুরুতে বলে দিতে পারেন তবে গিট্ সেটিকে কিছুটা অন্যভাবে পরিচালনা করবে।এক্ষেত্রে গিট্ প্রয়োজন অনুসারে হার্ডলিংক ব্যবহার করতে চেষ্টা করবে অথবা সরাসরি ফাইল কপি করবে। আর যদি আপনি file:// বলে দেন তবে গিট্ সাধারণত একটি নেটওয়ার্কে ডেটা ট্রান্সফার করতে যেসব প্রসেস রান করে সেগুলি রান করবে।

file:// পূর্বে ব্যবহার করার ফলে রিপোসিটোরির সাথে বাহিরের কোনো রেফারেন্স বা অবজেক্ট বাদ দিয়ে স্বচ্ছ কপি আসবে -সাধারণত অন্য ভিসিএস বা অনুরূপ কিছু থেকে ইম্পোর্ট এর ক্ষেত্রে ( টাস্ক মেইনটেইন এর ক্ষেত্রে Git Internal দেখুন )। এখানে স্বাভাবিক পাথ ব্যবহার করাই ভালো কারণ তাতে সময় কম লাগে। একটি এক্সিস্টিং প্রজেক্ট গিট দিয়ে একটি লোকাল রিপোসিটোরিতে অ্যাড করতে, আপনি এরূপ কিছু রান করতে পারেন:
				
					$ git remote add local_proj /srv/git/project.Git 
				
			
অতঃপর,আপনি আপনার নতুন রিমোট local_proj এর নাম ব্যবহারের মাধ্যমে একটি নেটওয়ার্কের মাধ্যমে সেই রিমোট থেকে পুশ এবং পুল করতে পারেন।

সুবিধাসমূহ

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

অন্য কারো রিপোসিটোরি দিয়েও এমনটি করা সম্ভব। যদি আপনারা কয়েকজন একটি প্রজেক্টে কাজ করেন এবং কোন ব্রাঞ্চ থেকে চেকআউট করতে এইরূপ কম্যান্ড টি git pull /home/john/project রান করতে পারেন।

অসুবিধাসমূহ

এই পদ্ধতির সবচেয়ে অসুবিধা হচ্ছে যে শেয়ার্ড অ্যাক্সেস সাধারণভাবে বেসিক নেটওয়ার্ক অ্যাক্সেসের চেয়ে একাধিক লোকেশন থেকে রিচ করা এবং সেট আপ করা কঠিন। যদি আপনি বাড়িতে থাকা অবস্থায় আপনার ল্যাপটপ থেকে পুশ করতে চান তাহলে আপনাকে রিমোট ডিস্ক মাউন্ট করতে হবে যা কিনা নেটওয়ার্ক-বেসড এক্সেস এর তুলনায় অনেকটা কঠিন এবং ধীর গতির হতে পারে।

উল্লেখ্য যে আপনি যদি কোনো ধরনের শেয়ার্ড মাউন্ট ব্যবহার করেন তবে সেটি দ্রুততম অপশন নয়। যদি শুধুমাত্র আপনার ডেটায় দ্রুত এক্সেস থাকে তাহলে লোকাল রিপোসিটোরি খুবই দ্রুত হয়। একই সার্ভারের NFS রিপোসিটোরি SSH রিপোসিটোরির তুলনায় প্রায়ই ধীর গতির হয়। সব সিস্টেমের লোকাল ডিস্কে গিট্ চালানো যায়।

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

এইচটিটিপি প্রোটোকল

Git দুটি ভিন্ন মোড ব্যবহার করে HTTP এর মাধ্যমে যোগাযোগ করতে পারে।গিট ভার্সন ১ .৬ .৬ এর পূর্বে এখানে একটিমাত্র পদ্ধতি ছিল যা সাধারণত রিড অনলি নামে পরিচিত ছিল । ১ .৬ .৬ ভার্শনে একটি নতুন এবং স্মার্ট প্রটোকল হয়েছে যার ফলে গিট বুদ্ধিমত্তার সাথে এসএসএইচ এর মতো ডেটা ট্রান্সফার করতে পারে। বিগত কিছু বছর ধরে, এই নতুন HTTP প্রোটোকলটি খুব জনপ্রিয় হয়ে উঠেছে কারণ এটি ব্যবহারকারীর জন্য সহজ এবং এর যোগাযোগ প্রক্রিয়াও আরও স্মার্ট। নতুন সংস্করণটিকে smart HTTP প্রোটোকল এবং পুরানো উপায়টিকে dumb HTTP হিসাবে উল্লেখ করা হয়। আমরা প্রথমে নতুন smart HTTP প্রোটোকল সম্পর্কে আলোকপাত করবো ।

স্মার্ট এইচটিটিপি

স্মার্ট এইচটিটিপি (smart HTTP) প্রোটোকলটি SSH প্রোটোকলের অনুরূপভাবে কাজ করে কিন্তু স্ট্যান্ডার্ড HTTPS পোর্টের উপর রান হয়। এটি বিভিন্ন HTTP অথেনটিকেশন প্রক্রিয়া ব্যবহার করতে পারে যার ফলে ব্যবহারকারীদের SSH key সেট আপ করার পরিবর্তে ব্যবহারকারীর নাম/পাসওয়ার্ড অথেন্টিকেশনে ব্যবহার করতে পারে।

যেহেতু এটি git:// প্রোটোকলের মতো anonymously উভয়টি সেট আপ করা যেতে পারে এবং SSH প্রোটোকলের মতো অথেনটিকেশন এবং এনক্রিপশন দিয়েও পুশ দেওয়া যেতে পারে সেহেতু এটি এখন গিট্ ব্যবহার করার সবচেয়ে জনপ্রিয় উপায় হয়ে উঠেছে। এক্ষেত্রে বিভিন্ন URL সেট আপ করার পরিবর্তে আপনি এখানে একটিমাত্র url উভয়ের জন্য ব্যবহার করতে পারবেন।আপনি যদি কোনো কিছু রিপোসিটোরি পুশ করার চেষ্টা করেন তবে আপনাকে অথেনটিকেশন করতে হবে।

Github এর সার্ভিস গুলোর মতো আপনি যে URL টি অনলাইনে রিপোসিটরি (উদাহরণসরূপ, https://github.com/schacon/simplegit) দেখতে ব্যবহার করেন তেমনি ক্লোন করতে একই URL ব্যবহার করতে পারবেন। এবং আপনার এক্সেস থাকলে আপনি পুশও করতে পারবেন।

ডাম্ব এইচটিটিপি

যদি গিট সার্ভার smart HTTP সার্ভিস দিয়ে কাজ না করে তবে গিট ক্লায়েন্ট, dumb HTTP প্রোটোকল দিয়ে চেষ্টা করতে হবে । dumb এইচটিটিপি প্রটোকল ব্যবহারে খালি গিট রিপোসিটোরি ওয়েব সার্ভার থেকে সাধারণ ফাইলের মতো দেখাবে। dumb HTTP এর সৌন্দর্য হল এটি সেট আপ করা সহজ। মূলত, আপনাকে যা করতে হবে তা হল আপনার HTTP রুট ফাইলের অধীনে একটি খালি গিট রিপোসিটোরি রাখতে হবে এবং post-update হুক ( Git Hooks দেখুন ) সেট আপ করতে হবে। এমতাবস্থায় আপনার রেখে দেয়া রিপোসিটরিতে যে কেউ ওয়েব সার্ভারের মাধ্যমে এক্সেস এবং রিপোসিটোরি ক্লোন করতে পারবে। আপনার রিপোসিটরিতে রিড এক্সেস দিতে নিচের মত করতে হবে –
				
					$ cd /var/www/htdocs/
$ git clone --bare /path/to/git_project gitproject.git
$ cd gitproject.git
$ mv hooks/post-update.sample hooks/post-update
$ chmod a+x hooks/post-update 
				
			
ডিফল্টরূপে গিট-এর সাথে থাকা post-update হুকটি http তে ক্লোনিং সঠিকভাবে কাজ করার জন্য প্রয়োজনীয় কমান্ড চালায়। আপনি যখন রিপোসিটোরি পুশ করেন তখন ওই কমান্ডটি চলে তারপর অন্যান্য লোকজন এইরূপ ভাবে ক্লোন করে –
				
					$ git clone https://example.com/gitproject.git 
				
			
বিশেষ ক্ষেত্রে,আমরা Apache সেটআপের জন্য এই কমন /var/www/htdocs পাথটি ব্যবহার করছি কিন্তু আপনি যেকনো স্ট্যাটিক ফাইল (ঠিক কিভাবে এই দেখানো হয় তা দেখতে Git Internals দেখুন ) ওয়েব সার্ভারে খালি রিপোসিটোরি এই পাথে বসাতে পারেন।

সুবিধাসমূহ

আমরা এখানে এইচটিটিপি প্রোটোকল এর স্মার্ট ভার্সন এর সুবিধা সমূহ নিয়ে মনোনিবেশ করবো।

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

আপনি HTTPS-এর মাধ্যমে আপনার রিপোসিটোরিগুলি শুধুমাত্র দেখতে পারেন;যার মানে আপনি আপনার কনটেন্ট ট্রান্সফার এনক্রিপ্ট করতে পারেন অথবা আপনি ক্লায়েন্টদের নির্দিষ্ট সিগনেচার SSL সার্টিফিকেট ব্যবহার করতে পারেন। আরেকটি চমৎকার জিনিস হল যে HTTP এবং HTTPS হল কমনলি ব্যবহৃত প্রোটোকল যার মাধ্যমে কর্পোরেট ফায়ারওয়ালগুলিকে প্রায়ই তাদের পোর্টের মাধ্যমে ট্র্যাফিকের অনুমতি দেওয়ার জন্য সেট আপ করা হয়।

অসুবিধাসমূহ

কিছু কিছু সার্ভারে SSH এর তুলনায় HTTPS-এর উপর গিট্ সেট আপ করা একটু বেশি কঠিন হতে পারে।তা ছাড়া গিট্ কনটেন্ট গুলো দেখানোর ক্ষেত্রে smart HTTP প্রোটোকল ছাড়া অন্যান্য প্রোটোকল সমূহের খুব কমই সুবিধা রয়েছে ।

আপনি যদি অথেন্টিকেশনে HTTP ইউজ করেন সেক্ষেত্রে আপনার ক্রেডেনশিয়াল প্রদান করা এসএসএইচ এর তুলনায় মাঝে মাঝে খুবই জটিল হয়ে পড়ে। যাহোক, বেশ কিছু ক্রেডেনশিয়াল ক্যাশিং টুল রয়েছে যা আপনি ব্যবহার করতে পারেন, যার মধ্যে রয়েছে ম্যাকওএস-এ কীচেইন অ্যাক্সেস এবং উইন্ডোজে ক্রেডেনশিয়াল ম্যানেজার,যা এটিকে বেশ ঝামেলা মুক্ত করে।কিভাবে আপনার সিস্টেমে এইচটিটিপি পাসওয়ার্ড ক্যাশিং সিকিউর রা যায় সেজন্য Credential Storage পড়ুন।

এসএসএইচ প্রোটোকল

এসএসএইচ প্রোটোকল হচ্ছে গিট্ এর একটি কমন ট্রান্সপোর্ট প্রোটোকল। এর কারণ হচ্ছে সার্ভারে এসএসএইচ এক্সেস বিভিন্ন জায়গায় সেট করা থাকে যদি নাও থাকে তবে এটি করা সহজ। এই প্রটোকলটি সাধারনণত সেটআপ ও ব্যবহার করতে সহজ। SSH দিয়ে গিট্ রিপোসিটোরি ক্লোন করতে আপনি ssh:// এইভাবে নির্ধারণ করে দিতে পারেন –
				
					$ git clone ssh://[user@]server/project.git
				
			
অথবা আপনি SSH প্রোটোকল এর শর্ট scp-like সিনটেক্স ব্যবহার করতে পারেন –
				
					$ git clone [user@]server:project.git
				
			
উভয় ক্ষেত্রেই আপনি যদি অপশনাল ইউজারনেম না দেন তাহলে গিট্ ধরেই নিবে আপনি বর্তমানে লগড ইন আছেন।

সুবিধাসমূহ

SSH ব্যবহারের সুবিধা অনেক। প্রথমত এসএসএইচ তুলনামূলক সেটআপ করা খুব সহজ। SSH ডেমনগুলি গতানুগতিক , অনেক নেটওয়ার্ক এডমিনদের এসম্পর্কে অভিজ্ঞতা রয়েছে এবং অনেক OS ডিস্ট্রিবিউশন এটি সেট আপ করেছেন বা তাদের পরিচালনা করার জন্য টুলস রয়েছে। তারপর SSH-এর মাধ্যমে অ্যাক্সেস করা নিরাপদ যেখানে ডেটা ট্রান্সফার এনক্রিপ্টেড এন্ড অথেন্টিকেটেড থাকে । সর্বশেষে https,git,local protocol এর মতো এসএসএইচ দক্ষ। ডেটা ট্রান্সফার করার পূর্বে যথাসম্ভব কম্প্যাক্ট করে নেয়।

অসুবিধাসমূহ

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

গিট্ প্রোটোকল

গিট্ প্রোটোকল হচ্ছে একটি বিশেষ ডেমন যা গিট্ প্যাকেজের সাথে আসে। এটি একটি ডেডিকেটেড পোর্ট থেকে শুনে (9418)। গিট প্রোটোকলের মাধ্যমে একটি রিপোসিটোরি দেখানো হয় ।এজন্য আপনাকে অবশ্যই একটি git-daemon-export-ok ফাইল তৈরি করা লাগবে।ঐ ফাইল ছাড়া ডেমন এর মধ্যে কোনো ফাইল দেখাবে না। সাধারণত গিট্ রিপোসিটোরি ক্লোন করা প্রত্যেকের জন্য উন্মুক্ত না কিন্তু এই প্রটোকলে যেই আপনার ইউআরএল খুঁজে পাবে সে পুশ করতে পারবে যা মোটেও নিরাপদ নয়।

সুবিধাসমূহ

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

অসুবিধাসমূহ

গিট্ প্রটোকলে খারাপ ধিক হল অথেন্টিকেশনের অভাব। এটি সেটআপ করা সম্ভবত সবচেয়ে কঠিন। সাধারণত, আপনি এটিকে SSH বা HTTPS অ্যাক্সেসের সাথে যুক্ত করবেন সেসব নতুন ডেভেলপারদের যাদের পুশ এক্সেস রয়েছে এবং ঐ সকলের জন্য যারা শুধুমাত্র রিড এক্সেস ব্যবহার করে গিট্ git:// ব্যবহার করে । এটি অবশ্যই নিজস্ব ডোমেনে রান হয় যাতে xinetd অথবা systemd কনফিগারেশন বা অনুরূপ কিছু দরকার ।এছাড়াও ইহাতে ৯৪১৮ পোর্টে ফায়ারওয়াল এক্সেস প্রয়োজন হয় যা সবসময় কর্পোরেট ফায়ারওয়াল অনুমতি দেয়না কারণ বেশিরভাগ ক্ষেত্রেই এই পোর্টটি ব্লক রাখা হয়।