<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[প্রজন্ম ফোরাম - সোর্স কোড ম্যানেজমেন্ট]]></title>
		<link>http://forum.projanmo.com/topic6864.html</link>
		<description><![CDATA[সোর্স কোড ম্যানেজমেন্ট এ সর্বশেষ পোস্ট]]></description>
		<lastBuildDate>Fri, 08 Aug 2008 05:17:20 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: সোর্স কোড ম্যানেজমেন্ট]]></title>
			<link>http://forum.projanmo.com/post71442.html#p71442</link>
			<description><![CDATA[<p>হুম..............তাহল গিট টা খারাপ না। পছন্দ হয়েছে। বিশেষ করে ব্যাকআপ স্টোরেজ এর ব্যাপারটা।</p><p>আরাফাত ভাইয়ের ব্যাপারটা আমার জন্য প্রযোজ্য নয়। কারণ এত স্পীড নাই। আবার লাইন না থাকলে আমি পূর্ণ মনোযোগে কাজ করতে পারি। কিন্তু ওভাবে করলে আমি পুরো নেট ডিপেনডেন্ট হয়ে যাব;(।</p>]]></description>
			<author><![CDATA[dummy@example.com (হাঙ্গরিকোডার)]]></author>
			<pubDate>Fri, 08 Aug 2008 05:17:20 +0000</pubDate>
			<guid>http://forum.projanmo.com/post71442.html#p71442</guid>
		</item>
		<item>
			<title><![CDATA[Re: সোর্স কোড ম্যানেজমেন্ট]]></title>
			<link>http://forum.projanmo.com/post71423.html#p71423</link>
			<description><![CDATA[<p>আমি ওয়েব সার্ভারে রিপো তৈরী করে নিয়েছি। এখন আরামছে কাজ করতেছি। যেখানেই যাই ইন্টারনেট লাইন থাকলেই হলো।</p>]]></description>
			<author><![CDATA[dummy@example.com (আরাফাত)]]></author>
			<pubDate>Fri, 08 Aug 2008 02:42:03 +0000</pubDate>
			<guid>http://forum.projanmo.com/post71423.html#p71423</guid>
		</item>
		<item>
			<title><![CDATA[Re: সোর্স কোড ম্যানেজমেন্ট]]></title>
			<link>http://forum.projanmo.com/post71410.html#p71410</link>
			<description><![CDATA[<p>অবশ্যই সেন্ট্রালাইজড করা যাবে। একটা রিপোতে সবসময় পুশ করলেই সেটা সেন্ট্রাল রিপো হবে। কিন্তু সেটার আসলে কোনই দরকার নাই। কেননা প্রত্যেকটা ক্লোনই একটা রিপো। এখানে যা লিখেছি তা শুধুমাত্র কমিট করাটা দেখিয়েছি। মুল কাজ তো পুশ-পুল-মার্জ। আর এখানেই svn, cvs এর সাথে git, mercurial -এর পার্থক্য। svn এ একটা রিপোজিটরি বানাতে হয়, তারপর সেখান থেকে চেকআউট ও পুশ করতে হয়। কিন্তু git -এ কোন একটা রিপো নেই। যেখানেই চেকআউট বা ক্লোন করা হবে সেটাই রিপোজিটরি। প্রত্যেকটাই সিঙ্ক করা যাবে। কোনরকম সমস্যা ছাড়াই।</p><p>ধরলাম, ডেস্কটপে কোডিং শুরু করেছি। সেটাই আমার প্রথম রিপো। ল্যাপটপে এটার ক্লোন নিলাম। তাহলে ল্যাপটপেরটাও সম্পূর্ণ রিপো, পার্থক্য শুধু গিট জানে ল্যাপটপেরটা ডেস্কটপ থেকে এসেছে। এখন আমি যদি ল্যাপটপে কমিট করতে থাকি। তারপর ডেস্কটপে ফিরে যেতে চাই তবে ডেস্কটপ থেকে ল্যাপটপেরটা পুল করবো, নয়তো ল্যাপটপ থেকে ডেস্কটপে পুশ করবো। ব্যস দুটোই সিঙ্ক হয়ে গেল। তাহলে আমার দুটো রিপো থাকছে। svn এর মতো একটা রিপো না। ডেস্কটপ যদি নষ্ট হয়ে যায় তাহলে svn রিপো শেষ। কিন্তু git রিপো শেষ হবে না, কারণ ওটা ল্যাপটপেও আছে!</p><p>এখন হাতে সময় নাই। কালকে আবার লিখব বিস্তারিত।</p>]]></description>
			<author><![CDATA[dummy@example.com (স্বপ্নচারী)]]></author>
			<pubDate>Thu, 07 Aug 2008 22:28:57 +0000</pubDate>
			<guid>http://forum.projanmo.com/post71410.html#p71410</guid>
		</item>
		<item>
			<title><![CDATA[Re: সোর্স কোড ম্যানেজমেন্ট]]></title>
			<link>http://forum.projanmo.com/post71408.html#p71408</link>
			<description><![CDATA[<p>কোডারের প্রবলেম তো যেকোন scm দিয়েই সলভ হবে। <br />আমি তো একই কাজ করি svn দিয়ে।</p><p>সকল রিপো হল আমার ডেস্কটপে। উবুন্তু হার্ডি। <br />যেসকল রিপো নিয়ে কাজ করি ল্যাপটপে সেগুলো ডেস্কটপ থেকে svn ক্লায়েন্টের মাধ্যেম ডাউনলোড (চেকআউট) করে নিয়েছি। এর পর যখন ওটা আপডেট করা দরকার তখন ল্যাপটপ থেকে শুধু কমিট করি। তাতে আপডেটেড অংশ রিপোতে যোগ হয়। আবার আমার ডেস্কটপে যদি ঐ সোর্সের উপর কাজ করি তবে সোর্স ট্রি আপডেট করে নেই svn ক্লায়েন্টের মাধ্যমে। এতে করে আমার সোর্স ট্রি মুল রিপোর সাথে সিনক্রোনাইজ হয়ে যায়। আবার অনেক সময় দু যায়গায়ই সোর্স মডি ফাই করে এক যায়গার কোড আপলোড (কমিট) করি। এমন&nbsp; হলে অন্য যায়গায় যে সোর্স ট্রিটা থাকে সেটা হয় তো বেশি আপডেটেড থাকে। তখন ঐ সোর্স ট্রির জন্য ডিফ(diff) দেখে নেই।</p><p>বিশাল ভেজাল মনে হচ্ছে আপাত দৃষ্টিতে।&nbsp; কিন্তু ব্যাপারটা এরকমই।</p>]]></description>
			<author><![CDATA[dummy@example.com (শিপলু)]]></author>
			<pubDate>Thu, 07 Aug 2008 20:29:32 +0000</pubDate>
			<guid>http://forum.projanmo.com/post71408.html#p71408</guid>
		</item>
		<item>
			<title><![CDATA[Re: সোর্স কোড ম্যানেজমেন্ট]]></title>
			<link>http://forum.projanmo.com/post71401.html#p71401</link>
			<description><![CDATA[<p>আমি আমার ল্যাপটপ ও ডেস্কটপের মধ্যে ডাটা সিঙ্ক করার জন্য ভাবছিলাম SVN এর সাহায্য নেব। এই টিউটোরিয়ালটি বেশ কাজে দিবে।&nbsp; তবে এর সাথে SVN, CVS এর সম্পর্ক বা পার্থক্যগুলো কোথায়?</p><p>এটা ডিস্ট্রিবিউটেড। কিন্তু সেন্ট্রালাইজ করার জন্য কি ব্যবহার করা যেতে পারে? </p><p>খালি পেছাইয়া ফেলছি। আমার সমস্যাটা বলি। </p><p>আমি ডেস্কটপ কে আবার মূল স্টোরেজ রাখব। কিন্তু ল্যাপটপ থেকে কাজ করব। ধরেন আমি সোর্সগুলো ল্যাপটপে কপি করে রাজশাহীতে চলে আসলাম (ধরেন ডেস্কটপ ঢাকায় আছে)। সেক্ষেত্রে আমি ফাইলগুলো তে কাজ করে আবার&nbsp; ঢাকায় গেলে&nbsp; যাতে ডেস্কটপের সাথে সিঙ্ক করতে পারি।&nbsp; </p><p>আবার এরকম যদি হয়, কোন কারণে ঐ (ঢাকার) ফাইলগুলো পরিবর্তিত হয়েছে, তাহলে কিভাবে এডজাস্ট হবে? (যতটুকু মনে পড়ে CVS এ সবগুলো ভার্সনকে মার্জ করা হয়)।</p><p>লিনাক্সে যেতে পারছি না, তাই পরীক্ষাও করতে পারছি না।:(</p>]]></description>
			<author><![CDATA[dummy@example.com (হাঙ্গরিকোডার)]]></author>
			<pubDate>Thu, 07 Aug 2008 19:11:38 +0000</pubDate>
			<guid>http://forum.projanmo.com/post71401.html#p71401</guid>
		</item>
		<item>
			<title><![CDATA[Re: সোর্স কোড ম্যানেজমেন্ট]]></title>
			<link>http://forum.projanmo.com/post71386.html#p71386</link>
			<description><![CDATA[<p>কিছুই বুঝলাম না। তবে পরে কাজে দেবে।</p>]]></description>
			<author><![CDATA[dummy@example.com (মেহেদী আকরাম)]]></author>
			<pubDate>Thu, 07 Aug 2008 18:00:36 +0000</pubDate>
			<guid>http://forum.projanmo.com/post71386.html#p71386</guid>
		</item>
		<item>
			<title><![CDATA[Re: সোর্স কোড ম্যানেজমেন্ট]]></title>
			<link>http://forum.projanmo.com/post71385.html#p71385</link>
			<description><![CDATA[<p>ধন্যবাদ নতুন জিনিস জানলাম।</p>]]></description>
			<author><![CDATA[dummy@example.com (microqatar)]]></author>
			<pubDate>Thu, 07 Aug 2008 17:55:54 +0000</pubDate>
			<guid>http://forum.projanmo.com/post71385.html#p71385</guid>
		</item>
		<item>
			<title><![CDATA[সোর্স কোড ম্যানেজমেন্ট]]></title>
			<link>http://forum.projanmo.com/post71374.html#p71374</link>
			<description><![CDATA[<p>একটা প্রোগ্রাম করার জন্য কোড করাটা যত জরুরী, সেই কোড ম্যানেজ করাটা ততটাই জরুরী। একবারে একটা সফটওয়্যার কখনও লিখে ফেলা যায় না। সফটওয়্যার লিখতে প্রচুর সময় ব্যয় হয়। এছাড়া কোন কিছু সম্পাদনা করার পর সেগুলোর ইতিহাস রাখাটাও জরুরী। আরও জরুরী কোন সফটওয়্যারের স্ট্যাবল ভার্সন আর ডেভেলপমেন্ট ভার্সন আলাদা রাখার। এসব কিছু মিলিয়ে সোর্স কোড ম্যানেজ করাটাকে SCM বলে।</p><p>মূলত দু&#039;ধরণের সফটওয়্যার ম্যানেজমেন্ট পদ্ধতি আছে। এক, সেন্ট্রালাইজড পদ্ধতি; দুই, ডিস্ট্রিবিউটেড পদ্ধতি। সেন্ট্রালাইজড পদ্ধতিতে সোর্স কোডটা এক জায়গায় থাকে। সেখানে এডমিনরা সোর্স কোড জমা (commit) দিতে পারে। অন্যদিকে ডিস্ট্রিবিউটেড পদ্ধতিতে যেকোন ডেভেলপারের নিজস্ব রিপোজিটরি থাকতে পারে। ফলে নানা ধরণের পরীক্ষা-নিরীক্ষা ডেভেলপার ইচ্ছে করলেই করতে পারে। নতুনদের জন্য কথাগুলো হয়তো মাথার উপর দিয়ে যাবে। তবুও ভুমিকার খাতিরে বলে নিলাম। এখানে আমি ছোট্ট একটা ধারণা দেব git এর উপরে। এটা ডিস্ট্রিবিউটেড পদ্ধতি।</p><p>আমি এখানে উবুন্তু ব্যবহার করছি। অন্যান্য ওএসে প্রয়োজনীয় সফটওয়্যার ইনস্টল করে নিতে হবে ঐ ওএসের নিয়মানুযায়ী।</p><p>উল্লেখ্য, $ সাইনটা বোঝাবে কমান্ড প্রম্পট। অর্থাৎ এর পরে যা লেখা হবে সেগুলো কমান্ড। সেটা লিখে রান করতে হবে। আর $ না থাকা মানে সেটা আগের কমান্ডের আউটপুট।</p><p>প্রথমে git ইনস্টল করি: </p><div class="codebox"><pre><code>$ sudo apt-get install git-core</code></pre></div><p>এবারে আমাদের প্রজেক্ট ফোল্ডার তৈরী করি: </p><div class="codebox"><pre><code>$ mkdir myproject</code></pre></div><p>এখানে নতুন একটা ফাইল তেরী করি:<br /></p><div class="codebox"><pre><code>$ cd myproject
$ touch main.cpp</code></pre></div><p>main.cpp ফাইলটা যেকোন এডিটরে ওপেন করে আমাদের কোড লিখি।<br /></p><div class="codebox"><pre><code>#include &lt;iostream&gt;

int main() {
  std::cout &lt;&lt; &quot;Hello world!&quot; &lt;&lt; std::endl;
  return 0;
}</code></pre></div><p>আমাদের কোড লেখা শেষ। এখন এটাকে কম্পাইল করা যাবে এবং রান করা যাবে। কিন্তু এখানে সেটা নিয়ে আমাদের মাথা ব্যথা নেই। আমরা এখানে এটা ম্যানেজ করা শিখবো। তবুও আসুন এটাকে কম্পাইল ও রান করি। নিচের কমান্ডগুলো এরকম এক নম্বরে কম্পাইল করলাম যেটা a.out নামে এক্সিকিউট্যাবল ফাইল তৈরী করল, দুই নম্বরে রান করলাম a.out, তিন নম্বরে আউপুট দেখালো।<br /></p><div class="codebox"><pre><code>$ g++ main.cpp
$ ./a.out
Hello world!</code></pre></div><p>আমরা myproject কে এখন একটা git রিপোজিটরিতে রূপান্তর করবো। এই পুরো প্রজেক্টটা এখন গিট দিয়ে ম্যানেজ হবে। গিট এই প্রজেক্টের সকল ধরণের পরিবর্তন মনে রাখবে। শুরু করা যাক।<br /></p><div class="codebox"><pre><code>$ git init</code></pre></div><p>myproject ফোল্ডারে থাকা অবস্থায় উপরের কমান্ডটা রান করতে হবে। ফলে .git নামে একটা ফোল্ডার তৈরী হবে যা লুকানো থাকবে। কেননা . দিয়ে শুরু হওয়া যেকোন ফাইল-ফোল্ডার লিনাক্স(ইউনিক্স)-এ লুকানো থাকে। এই ফোল্ডারের ভেতরেই গিট তার সমস্ত কিছু স্টোর করবে।</p><p>এবারে দেখি আমাদের রিপোজিটরি কী অবস্থায় আছে।<br /></p><div class="codebox"><pre><code>$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use &quot;git add &lt;file&gt;...&quot; to include in what will be committed)
#
#    a.out
#    main.cpp
nothing added to commit but untracked files present (use &quot;git add&quot; to track)</code></pre></div><p>এখানে git status রান করার পর দেখতে পাচ্ছি যে আমাদের প্রজেক্টে দুটো ফাইল আছে a.out, main.cpp কিন্তু এরা untracked অবস্থায় রয়েছে। এর মানে হচ্ছে এই প্রজেক্টে আমরা এই দুটো ফাইলকে ইচ্ছে ট্র্যাক করতে পারি। এখন যদি আমরা</p><div class="codebox"><pre><code>git add .</code></pre></div><p>রান করি&nbsp; তাহলে সব ফাইল রিপোজিটরিতে যুক্ত হয়ে যাবে। কিন্তু আমরা সেটা চাই না, কারণ a.out বাইনারী এক্সিকিউট্যাবল ফাইল। এটা ম্যানেজ করার কিছু নাই। শুধুমাত্র main.cpp যোগ করি এভাবে -<br /></p><div class="codebox"><pre><code>$ git add main.cpp
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use &quot;git rm --cached &lt;file&gt;...&quot; to unstage)
#
#    new file: main.cpp
#
# Untracked files:
#   (use &quot;git add &lt;file&gt;...&quot; to include in what will be committed)
#
#    a.out</code></pre></div><p>এখন স্ট্যাটাস দেখছি যে main.cpp ফাইলটা ট্র্যাকিং-এ যুক্ত হয়েছে কিন্তু a.out হয়নি। এখন মুল কাজ, অর্থাৎ কমিট করা। commit মানে হচ্ছে রিপোতে চালান দেয়া। git add দিয়ে আমরা ট্র্যাকিং যুক্ত করলাম&nbsp; কিন্তু আসলে রিপোতে যুক্ত করতে হলে আমাদের নিচের কমান্ড রান করতে হবে।<br /></p><div class="codebox"><pre><code>$ git commit -m &quot;initial commit&quot;
 1 files changed, 7 insertions(+), 0 deletions(-)
 create mode 100644 main.cpp</code></pre></div><p>-m &quot;initial commit&quot; হচ্ছে এই কমিটের ম্যাসেজ। প্রত্যেকটা কমিটে কী পরিবর্তন হলো তার ছোট্ট একটা সারাংশ লিখতে হয়, যাতে সহজেই বোঝা যায় কী কী পরিবর্তন করা হয়েছে। এখন যদি আমরা স্ট্যাটাস দেখি তাহলে -<br /></p><div class="codebox"><pre><code>$ git status
# On branch master
# Untracked files:
#   (use &quot;git add &lt;file&gt;...&quot; to include in what will be committed)
#
#    a.out
nothing added to commit but untracked files present (use &quot;git add&quot; to track)</code></pre></div><p>দেখছি যে a.out ফাইলটা ছাড়া আমাদের অন্য কোন পরিবর্তন হয়নি প্রজেক্টে। যেহেতু আমরা এটাকে ম্যানেজ করতে চাই না। এটাকে ইগনোর করি সবসময়।<br /></p><div class="codebox"><pre><code>$ cat &gt; .gitignore
a.out
.gitignore
Ctrl+D</code></pre></div><p>এখানে যেটা করলাম, সেটা হলো .gitignore নামে নতুন একটা ফাইল খুললাম তারপর সেই ফাইলে a.out এবং .gitignore লিখলাম। লেখা শেষে Ctrl+D দিয়ে ফাইল সেভ করে বেরিয়ে গেলাম। এটা এভাবে না করে কোন টেক্সট এডিটরে করলেও চলবে। .gitignore একটা ফাইল, এখানে আমরা যেসব ফাইল ম্যানেজ করতে চাই না, সেসবের লিস্ট রাখব। এবারে যদি স্ট্যাটাস দেখি তবে<br /></p><div class="codebox"><pre><code>$ git status
# On branch master
nothing to commit (working directory clean)</code></pre></div><p>দেখছি যে কমিট করার কিছু নাই। অর্থাৎ আমাদের প্রজেক্ট ভালোভাবেই ম্যানেজ হয়েছে। এবারে কিছু পরিবর্তন করি কোডে (main.cpp ফাইলে)<br /></p><div class="codebox"><pre><code>#include &lt;iostream&gt;

using namespace std;

int main() {
  cout &lt;&lt; &quot;Hello world!&quot; &lt;&lt; endl;
  return 0;
}</code></pre></div><p>ফাইলট সেভ করার পর গিট স্ট্যাটাস দেখি।<br /></p><div class="codebox"><pre><code>$ git status
# On branch master
# Changed but not updated:
#   (use &quot;git add &lt;file&gt;...&quot; to update what will be committed)
#
#    modified:   main.cpp
#
no changes added to commit (use &quot;git add&quot; and/or &quot;git commit -a&quot;)</code></pre></div><p>দারুণ, main.cpp ফাইলটা পরিবর্তিত হয়েছে। দেখি কী পরিবর্তন হয়েছে -<br /></p><div class="codebox"><pre><code>$ 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 &lt;iostream&gt;
 
+using namespace std;
+
 int main() {
-    std::cout &lt;&lt; &quot;Hello world!&quot; &lt;&lt; std::endl;
+   cout &lt;&lt; &quot;Hello world!&quot; &lt;&lt; endl;
       return 0;
 }</code></pre></div><p>আমরা দেখতে পাচ্ছি, দুটো পরিবর্তন হয়েছে + হচ্ছে নতুন লাইন, - হচ্ছে মুছে ফেলা লাইন। এবারে commit করি।<br /></p><div class="codebox"><pre><code>$ git commit -a -m &quot;std namespace added to the global scope&quot;
Created commit d8a22d5: std namespace added to the global scope
 1 files changed, 3 insertions(+), 1 deletions(-)</code></pre></div><p>দেখতে পাচ্ছি একটা নতুন অপশন যুক্ত হয়েছে -a , এটা মডিফাইড ফাইলগুলোকে যুক্ত করে কমিট করবে। এটা git add এর শর্টকাট। এখন আমরা দেখি কতবার এই গিট রিপোতে কমিট করা হয়েছে, কে করেছে এবং কেন করেছে -<br /></p><div class="codebox"><pre><code>$ git log
commit d8a22d57110121ce42ba1c9793ea58f3b02e456a
Author: নাসিম &lt;nasim....@gmail.com&gt;
Date:   Thu Aug 7 16:23:39 2008 +0100

    std namespace added to the global scope

commit 317e85121c9955a657822f1d8e2657edac8416ff
Author: নাসিম &lt;nasim....@gmail.com&gt;
Date:   Thu Aug 7 15:56:35 2008 +0100

    initial commit</code></pre></div><p>ব্যস, শুরু হয়ে গেল প্রজেক্ট ম্যানেজমেন্ট। এটা শুধুইমাত্র বেসিক টিউটোরিয়াল। গিট সম্পর্কে একটা ছোট্ট ধারণা মাত্র। গিট আরও অনেক শক্তিশালী জিনিষ। গিট-এর উপর প্রচুর টিউটোরিয়াল পাওয়া যাবে ইন্টারনেটে।</p><p><a href="http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html">অফিশিয়াল টিউটোরিয়াল</a></p>]]></description>
			<author><![CDATA[dummy@example.com (স্বপ্নচারী)]]></author>
			<pubDate>Thu, 07 Aug 2008 15:31:01 +0000</pubDate>
			<guid>http://forum.projanmo.com/post71374.html#p71374</guid>
		</item>
	</channel>
</rss>
