গিটহাবের ওপেন সোর্স প্রোজেক্টে কন্ট্রিবিউট করার একটি সাধারণ গাইডলাইন

October 20, 2016

প্রাককথন

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

এই লেখাটি ভালভাবে বুঝার জন্য গিট এর বেসিক বিষয়গুলো জানা থাকতে হবে।

এই গাইডটির সঠিক অনুশীলনের জন্য একটি সহজ গিটহাব প্রোজেক্ট তৈরি করা হয়েছে। আপনি এই লেখাটর বিষয়বস্তু ঐ রিপোতে হাতে কলমে ব্যাবহার করতে পারবেন।

এই লেখাটি একটি সাধারণ গাইডলাইন। তাই বিভিন্ন প্রোজেক্টের কন্ট্রিবিউশন গাইডলাইন নির্দিষ্টভাবে জানতে সেই প্রজেক্টের README ফাইল পড়ুন।

প্রথম ধাপঃ একটি লোকাল ওয়ার্কিং কপি সেটআপ করা

প্রথমেই আপনি যে প্রোজেক্টের উপর কাজ করতে আগ্রহী, সেই প্রোজেক্টের একটি লোকাল ফর্ক করতে হবে। তার জন্য সেই প্রোজেক্ট রিপোজিটোরির গিটহাব পেইজে গিয়ে fork বাটনটি ক্লিক করুন। এতে করে আপনার নিজের গিটহাব অ্যাকাউন্টে এই রিপোজিটোরির একটি কপি তৈরি হবে। লক্ষ্য করলে দেখবেন, আপনার নতুন রিপোজিটোরির নিচে মেইন প্রোজেক্ট ফর্ক করেছেন তা উল্লেখ থাকবে।

উদাহরণ হিসেবে নিচের ছবিটি দেখুন। এখানে zahedul আমাদের প্রোজেক্টটি (arifin4web/github-contribution-tuts) তার নিজের গিটহাব অ্যাকাউন্টএ ফর্ক করেছে

fork

এখন আপনার গিটহাব অ্যাকাউন্ট থেকে আপনার লোকাল ডেভেলপমেন্ট মেশিনে একটি কপি তৈরি করতে হবে। তার জন্য আপনার ফর্ক করা রিপো থেকে SSH clone URL খুঁজে বের করুন (ডানদিকে থাকে) এবং সেই url দিয়ে লোকাল একটি ক্লোন তৈরি করুন।

$ git clone "Your Forked Repository's SSH clone URL here"

এতে করে আপনার লোকালে প্রোজেক্টটি তৈরি হবে। প্রোজেক্ট ডিরেক্টরিতে যান।

$ cd project directory

দ্বিতীয় ধাপঃ অরিজিনাল প্রোজেক্টকে পয়েন্ট করে নতুন remote সেটআপ করা

এই পর্যায়ে অরিজিনাল প্রোজেক্টকে পয়েন্ট করে একটি নতুন remote সেটআপ করতে হবে। এতে করে আমরা অরিজিনাল প্রোজেক্টের সকল পরিবর্তন/আপডেট আমাদের লোকাল কপি তে নিয়ে আসতে পারব।

অরিজিনাল প্রোজেক্টের রিপোজিটোরিতে যান (আপনার ফর্ক-কৃত টি নয়)। সেটির SSH clone URL টি খুঁজে বের করুন। আমরা এই SSH clone URL টি ব্যাবহার করে নতুন একটি remote তৈরি করবো, যার নাম হবে upstream.

$ git remote add upstream "Original Projects SSH clone URL here"

আপনার প্রোজেক্টের এখন ২ টি remote রয়েছেঃ

  • origin: যেটি আপনার গিটহাব অ্যাকাউন্টে ফর্ককৃত প্রোজেক্টটিতে পয়েন্ট করে। আপনি এই রিপো তে read এবং write দুটোই করতে পারবেন।
  • upstream: যেটি অরিজিনাল প্রোজেক্টের গিটহাব রিপোজিটোরিতে পয়েন্ট করে। আপনি এই রিপো তে শুধুমাত্র read করতে পারবেন।

তৃতীয় ধাপঃ চলুন কিছু কাজ করা যাক

আসল মজা শুরু হবে যখন আপনি প্রজেক্টে কিছু কন্ট্রিবিউট করা শুরু করবেন। প্রতিটি রিপোর Issue Tracker এ কিছু ইস্যু থাকে। আপনি সেগুলো ঠিক করার মাধ্যমে শুরু করতে পারেন। তবে আমার পরামর্শ হল এমন কিছু bug সলভ করা যা আপনি ফেইস করেছেন বা এমন কোনও ফিচার যা আপনার কাছে পছন্দ নয়। অনেক প্রোজেক্টই easy pick লেবেল ব্যাবহার করে কিছু issue থাকে, যা অপেক্ষাকৃত নতুনরাও সলভ করতে পারে।

যাই হোক, সহজ করার জন্য আমরা এই Example এ শুধু মাত্র আমাদের নিজেদের নামটি প্রোজেক্টের README.md ফাইলে লিখব।

Markdown লাঙ্গুয়াজে কিভাবে ordered লিস্ট লিখে এবং কিভাবে লিংক ইনসার্ট করে তা দেখে নিবেন।

প্রথমেই মনে রাখবেন যে, আপনার প্রতিটি কাজ এক একটি আলাদা branch এ করতে হবে সাধারণত প্রোজেক্টটিতে যদি git-flow অনুসরণ করা হয় তাহলে আপনি master এবং development দুটো branch ই পাবেন। সাধারণত নিয়ম হল, যদি bugfix করে থাকেন তবে ব্রাঞ্চটি master থেকে আর নতুন ফিচার ডেভেলপমেন্ট করার জন্য ব্রাঞ্চটি development থেকে করবেন। যদি প্রোজেক্টটিতে শুধুমাত্র master ব্রাঞ্চ থাকে, তবে সেটি থেকে ব্রাঞ্চ করুন। অনেক ক্ষেত্রে ভার্সনের নাম্বার অনুযায়ী ব্রাঞ্চ থাকে। সে ক্ষেত্রে যথাযথ ব্রাঞ্চটি ব্যাবহার করুন।

আমরা ধরে নিচ্ছি আমরা একটি bugfix করবো। তাহলে আমরা master থেকে ব্রাঞ্চ করতে হবে।

$ git checkout master
$ git pull upstream master && git push origin master
$ git checkout -b hotfix/add-me

উপরের কোডটুকু দেখেন, প্রথমেই নিশ্চিত করে নিলাম আমরা মাস্টার ব্রাঞ্চেই আছি। git pull কমান্ডটি অরিজিনাল প্রোজেক্ট (যাকে আমরা upstream বলছি) কোড থেকে আমাদের লোকাল কোডকেে সিঙ্ক করে নিবে এবং git push কমান্ডটি লোকাল থেকে ফর্ককৃত গিটহাব প্রোজেক্টটির কোড সিঙ্ক করে নিবে। এবং তারপর আমরা আমাদের নতুন একটি ব্রাঞ্চ খুলে নিলাম।

প্রতিটি আলাদা কাজ এক একটি নতুন ব্রাঞ্চে করতে হবে

আপনি আপনার ব্রাঞ্চের নাম আপনার খুশি মত দিতে পারেন, তবে অর্থবোধক নাম ব্যাবহার করাই সুবিধাজনক। যদি কোনও issue সলভ করে থাকেন, তবে ইস্যু নাম্বার ব্যাবহার করা সুবিধাজনক। যদি প্রোজেক্টটিতে git-flow ব্যাবহার করা হয়ে থাকে তবে সেক্ষেত্রে কিছু নেমিং কনভেনশন থাকে। যেমন ব্রাঞ্চের নামের আগে hotfix/ অথবা feature/ এগুলো ব্যাবহার হয়ে থাকে।

এই পর্যন্ত সফলভাবে করে থাকলে, এখন আপনি আপনার কাজ শুরু করতে পারেন। আমাদের ক্ষেত্রে আমরা শুধু মাত্র README.md ফাইলে পরিবর্তন করবো।

এক্ষেত্রে শেষ কিছু কথা হল, একটি ব্রাঞ্চে শুধুমাত্র একটু ইস্যু (bugfix/feature) নিয়ে কাজ করুন, সেই সংক্রান্ত কোডই লিখুন। একটি ইস্যুতে কাজ করতে গিয়ে অন্য ইস্যুর কাজ করবেন না। আলাদা আলাদা ব্রাঞ্চ করে কাজ করবেন। আর লজিকাল ব্লকগুলেতে কমিট করতে ভুলবেন না। কমিট ম্যাসেজগুলোকে প্রাসঙ্গিক রাখুন।

চতুর্থ ধাপঃ পূল রিকোয়েস্ট

পূল রিকোয়েস্ট করার জন্য প্রথমেই আপনার ব্রাঞ্চটিকে origin remote এ push করতে হবে।

$ git push -u origin hotfix/readme-update

এটি আপনার গিটহাব প্রোজেক্টটিতে (ফর্ককৃত) ব্রাঞ্চটি তৈরি করবে। কম্যান্ডটিতে -u ব্যাবহার করার কারনে পরবর্তীতে git push origin দিলেই হবে।

এখন যদি আপনি ব্রাউজারের মাধ্যমে আপনার ফর্ককৃত প্রোজেক্টটিতে যান, তবে সেখানে একটি নতুন ব্রাঞ্চটিকে দেখতে পাবেন। যার পাশে Compare & pull request বাটনটি দেখতে পাবেন।

pull request button

বাটনটি প্রেস করুন। এতে যে পেইজটিতে যাবেন তাতে যদি CONTRIBUTING ফাইল এর লিংক থাকে তবে সেটি পড়ুন। সাধারণত এই ফাইলে প্রোজেক্টের কোডেবেজ নিয়ে কিভাবে কাজ করবেন তার বর্ণনা থাকে। আপনার এই গাইডলাইন অনুসরণ করেই কন্ট্রিবিউশন করা উচিত।

এরপর, লক্ষ্য করুন এই পেইজে baes fork এ রিপোজিটরি এবং ব্রাঞ্চ সঠিক রয়েছে কিনা? তারপর আপনার পূল রিকোয়েস্ট এর একটি সুন্দর টাইটেল এবং বর্ণনা দিন। বিস্তারিত ভাবে উল্লেখ করেন কেন আপনি এই কাজটি করেছেন। যদি এর সাথে সংশ্লিষ্ট কোনও Issue থেকে থাকে তবে তার ইস্যু নাম্বার টি উল্লেখ করুন।

pull request

একটু নিচে নামলেই, আপনি যে কোড লিখেসেন তার diff দেখতে পাবেন। ভালভাবে খেয়াল করুন, আপনার কোড ঠিক আছে কিনা।

diff

সব ঠিক থাকলে Create pull request বাটনটি চাপুন। আপনার কাজ সফলভাবে শেষ হয়েছে।

পঞ্চম ধাপঃ মেনটেইনারের দ্বারা রিভিউ প্রসেস

আপনার কাজটি প্রোজেক্টে ইনটিগ্রেড করতে, প্রোজেক্টের মেনটেইনার আপনার কোড রিভিউ করবে। যদি সব ঠিক থাকে তবে সে কোড মার্জ করে নিবে আর নাহলে কোড পরিবর্তন করার জন্য Request করবে।

সারমর্ম

আমরা যদি পুরো প্রসেসটির একটি সারমর্ম করি, তাহলে যা দাঁড়াবেঃ

  • প্রোজেক্টটি ফর্ক করুন। লোকালে ক্লোন করুন।

  • upstream রিমোট তৈরি করুন এবং ব্রাঞ্চ তৈরি করার আগে আপনার লোকাল কপিটি সিঙ্ক করুন।

  • প্রতিটি আলাদা কাজের জন্য আলাদা ব্রাঞ্চ তৈরি করুন।

  • কাজ করুন, সুন্দর এন্ড অর্থবোধক কমিট ম্যাসেজ দিন। কাজ করার আগে এবং কাজ করার সময় CONTRIBUTING ফাইলটি পড়ুন (যদি থাকে)।

  • আপনার origin রিপোতে push করুন।

  • গিটহাব এ নতুন পূল রিকুয়েস্ট তৈরি করুন।

  • মেনটেইনারের কাছ থেকে কোন কোড রিভিউ থাকলে যথাযথ উত্তর দিন।