টপিকঃ সোর্স কোড ম্যানেজমেন্ট
একটা প্রোগ্রাম করার জন্য কোড করাটা যত জরুরী, সেই কোড ম্যানেজ করাটা ততটাই জরুরী। একবারে একটা সফটওয়্যার কখনও লিখে ফেলা যায় না। সফটওয়্যার লিখতে প্রচুর সময় ব্যয় হয়। এছাড়া কোন কিছু সম্পাদনা করার পর সেগুলোর ইতিহাস রাখাটাও জরুরী। আরও জরুরী কোন সফটওয়্যারের স্ট্যাবল ভার্সন আর ডেভেলপমেন্ট ভার্সন আলাদা রাখার। এসব কিছু মিলিয়ে সোর্স কোড ম্যানেজ করাটাকে SCM বলে।
মূলত দু'ধরণের সফটওয়্যার ম্যানেজমেন্ট পদ্ধতি আছে। এক, সেন্ট্রালাইজড পদ্ধতি; দুই, ডিস্ট্রিবিউটেড পদ্ধতি। সেন্ট্রালাইজড পদ্ধতিতে সোর্স কোডটা এক জায়গায় থাকে। সেখানে এডমিনরা সোর্স কোড জমা (commit) দিতে পারে। অন্যদিকে ডিস্ট্রিবিউটেড পদ্ধতিতে যেকোন ডেভেলপারের নিজস্ব রিপোজিটরি থাকতে পারে। ফলে নানা ধরণের পরীক্ষা-নিরীক্ষা ডেভেলপার ইচ্ছে করলেই করতে পারে। নতুনদের জন্য কথাগুলো হয়তো মাথার উপর দিয়ে যাবে। তবুও ভুমিকার খাতিরে বলে নিলাম। এখানে আমি ছোট্ট একটা ধারণা দেব git এর উপরে। এটা ডিস্ট্রিবিউটেড পদ্ধতি।
আমি এখানে উবুন্তু ব্যবহার করছি। অন্যান্য ওএসে প্রয়োজনীয় সফটওয়্যার ইনস্টল করে নিতে হবে ঐ ওএসের নিয়মানুযায়ী।
উল্লেখ্য, $ সাইনটা বোঝাবে কমান্ড প্রম্পট। অর্থাৎ এর পরে যা লেখা হবে সেগুলো কমান্ড। সেটা লিখে রান করতে হবে। আর $ না থাকা মানে সেটা আগের কমান্ডের আউটপুট।
প্রথমে git ইনস্টল করি:
$ sudo apt-get install git-coreএবারে আমাদের প্রজেক্ট ফোল্ডার তৈরী করি:
$ mkdir myprojectএখানে নতুন একটা ফাইল তেরী করি:
$ cd myproject
$ touch main.cppmain.cpp ফাইলটা যেকোন এডিটরে ওপেন করে আমাদের কোড লিখি।
#include <iostream>
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}আমাদের কোড লেখা শেষ। এখন এটাকে কম্পাইল করা যাবে এবং রান করা যাবে। কিন্তু এখানে সেটা নিয়ে আমাদের মাথা ব্যথা নেই। আমরা এখানে এটা ম্যানেজ করা শিখবো। তবুও আসুন এটাকে কম্পাইল ও রান করি। নিচের কমান্ডগুলো এরকম এক নম্বরে কম্পাইল করলাম যেটা a.out নামে এক্সিকিউট্যাবল ফাইল তৈরী করল, দুই নম্বরে রান করলাম a.out, তিন নম্বরে আউপুট দেখালো।
$ g++ main.cpp
$ ./a.out
Hello world!আমরা myproject কে এখন একটা git রিপোজিটরিতে রূপান্তর করবো। এই পুরো প্রজেক্টটা এখন গিট দিয়ে ম্যানেজ হবে। গিট এই প্রজেক্টের সকল ধরণের পরিবর্তন মনে রাখবে। শুরু করা যাক।
$ git initmyproject ফোল্ডারে থাকা অবস্থায় উপরের কমান্ডটা রান করতে হবে। ফলে .git নামে একটা ফোল্ডার তৈরী হবে যা লুকানো থাকবে। কেননা . দিয়ে শুরু হওয়া যেকোন ফাইল-ফোল্ডার লিনাক্স(ইউনিক্স)-এ লুকানো থাকে। এই ফোল্ডারের ভেতরেই গিট তার সমস্ত কিছু স্টোর করবে।
এবারে দেখি আমাদের রিপোজিটরি কী অবস্থায় আছে।
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# a.out
# main.cpp
nothing added to commit but untracked files present (use "git add" to track)এখানে git status রান করার পর দেখতে পাচ্ছি যে আমাদের প্রজেক্টে দুটো ফাইল আছে a.out, main.cpp কিন্তু এরা untracked অবস্থায় রয়েছে। এর মানে হচ্ছে এই প্রজেক্টে আমরা এই দুটো ফাইলকে ইচ্ছে ট্র্যাক করতে পারি। এখন যদি আমরা
git add .রান করি তাহলে সব ফাইল রিপোজিটরিতে যুক্ত হয়ে যাবে। কিন্তু আমরা সেটা চাই না, কারণ a.out বাইনারী এক্সিকিউট্যাবল ফাইল। এটা ম্যানেজ করার কিছু নাই। শুধুমাত্র main.cpp যোগ করি এভাবে -
$ git add main.cpp
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: main.cpp
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# a.outএখন স্ট্যাটাস দেখছি যে main.cpp ফাইলটা ট্র্যাকিং-এ যুক্ত হয়েছে কিন্তু a.out হয়নি। এখন মুল কাজ, অর্থাৎ কমিট করা। commit মানে হচ্ছে রিপোতে চালান দেয়া। git add দিয়ে আমরা ট্র্যাকিং যুক্ত করলাম কিন্তু আসলে রিপোতে যুক্ত করতে হলে আমাদের নিচের কমান্ড রান করতে হবে।
$ git commit -m "initial commit"
1 files changed, 7 insertions(+), 0 deletions(-)
create mode 100644 main.cpp-m "initial commit" হচ্ছে এই কমিটের ম্যাসেজ। প্রত্যেকটা কমিটে কী পরিবর্তন হলো তার ছোট্ট একটা সারাংশ লিখতে হয়, যাতে সহজেই বোঝা যায় কী কী পরিবর্তন করা হয়েছে। এখন যদি আমরা স্ট্যাটাস দেখি তাহলে -
$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# a.out
nothing added to commit but untracked files present (use "git add" to track)দেখছি যে a.out ফাইলটা ছাড়া আমাদের অন্য কোন পরিবর্তন হয়নি প্রজেক্টে। যেহেতু আমরা এটাকে ম্যানেজ করতে চাই না। এটাকে ইগনোর করি সবসময়।
$ cat > .gitignore
a.out
.gitignore
Ctrl+Dএখানে যেটা করলাম, সেটা হলো .gitignore নামে নতুন একটা ফাইল খুললাম তারপর সেই ফাইলে a.out এবং .gitignore লিখলাম। লেখা শেষে Ctrl+D দিয়ে ফাইল সেভ করে বেরিয়ে গেলাম। এটা এভাবে না করে কোন টেক্সট এডিটরে করলেও চলবে। .gitignore একটা ফাইল, এখানে আমরা যেসব ফাইল ম্যানেজ করতে চাই না, সেসবের লিস্ট রাখব। এবারে যদি স্ট্যাটাস দেখি তবে
$ git status
# On branch master
nothing to commit (working directory clean)দেখছি যে কমিট করার কিছু নাই। অর্থাৎ আমাদের প্রজেক্ট ভালোভাবেই ম্যানেজ হয়েছে। এবারে কিছু পরিবর্তন করি কোডে (main.cpp ফাইলে)
#include <iostream>
using namespace std;
int main() {
cout << "Hello world!" << endl;
return 0;
}ফাইলট সেভ করার পর গিট স্ট্যাটাস দেখি।
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
#
# modified: main.cpp
#
no changes added to commit (use "git add" and/or "git commit -a")দারুণ, main.cpp ফাইলটা পরিবর্তিত হয়েছে। দেখি কী পরিবর্তন হয়েছে -
$ git diff
diff --git a/main.cpp b/main.cpp
index 8b0efc3..a9f1dce 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,7 +1,9 @@
#include <iostream>
+using namespace std;
+
int main() {
- std::cout << "Hello world!" << std::endl;
+ cout << "Hello world!" << endl;
return 0;
}আমরা দেখতে পাচ্ছি, দুটো পরিবর্তন হয়েছে + হচ্ছে নতুন লাইন, - হচ্ছে মুছে ফেলা লাইন। এবারে commit করি।
$ git commit -a -m "std namespace added to the global scope"
Created commit d8a22d5: std namespace added to the global scope
1 files changed, 3 insertions(+), 1 deletions(-)দেখতে পাচ্ছি একটা নতুন অপশন যুক্ত হয়েছে -a , এটা মডিফাইড ফাইলগুলোকে যুক্ত করে কমিট করবে। এটা git add এর শর্টকাট। এখন আমরা দেখি কতবার এই গিট রিপোতে কমিট করা হয়েছে, কে করেছে এবং কেন করেছে -
$ git log
commit d8a22d57110121ce42ba1c9793ea58f3b02e456a
Author: নাসিম <nasim....@gmail.com>
Date: Thu Aug 7 16:23:39 2008 +0100
std namespace added to the global scope
commit 317e85121c9955a657822f1d8e2657edac8416ff
Author: নাসিম <nasim....@gmail.com>
Date: Thu Aug 7 15:56:35 2008 +0100
initial commitব্যস, শুরু হয়ে গেল প্রজেক্ট ম্যানেজমেন্ট। এটা শুধুইমাত্র বেসিক টিউটোরিয়াল। গিট সম্পর্কে একটা ছোট্ট ধারণা মাত্র। গিট আরও অনেক শক্তিশালী জিনিষ। গিট-এর উপর প্রচুর টিউটোরিয়াল পাওয়া যাবে ইন্টারনেটে।
সর্বশেষ সম্পাদনা করেছেন স্বপ্নচারী (21-08-2008 15:43)



লেখাটি GPL v3 এর অধীনে প্রকাশিত