Vivasoft-logo

2.6 গিট বেসিক – ট্যাগিং

ট্যাগিং

বেশিরভাগ ভিসিএস এর মতোন, গিটেরও কোন রিপোসিটরির হিস্টোরিকে গুরুত্বপূর্ণ বলে ট্যাগ করার ক্ষমতা রয়েছে। সাধারণত রিলিজ পয়েন্ট মার্ক করার জন্য এই ফাংশনালিটিটা ব্যবহার করা হয় যেমন – v1.0, v2.0 ইত্যাদি। এই সেকশনে আমরা এক্সিসটিং ট্যাগগুলোর তালিকা কিভাবে করতে হয়, কিভাবে ট্যাগ ক্রিয়েট ও ডিলিট করা হয় এবং কি কি ভিন্ন ধরনের ট্যাগ আছে তা সম্পর্কে জানব।

ট্যাগগুলোকে লিস্টিং করা

গিটে এক্সিসটিং ট্যাগের লিস্ট করা একটা সোজাসাপ্টা পদ্ধতি শুধুমাত্র git tag (অপশনাল -l বা –list) টাইপ করলে হয়ে যায়।
				
					$ git tag
v1.0
v2.0

				
			
এই কমান্ডের মাধ্যমে লিস্টগুলোকে বর্ণানুক্রমে লিস্ট করা হয় কিন্তু এই ক্রমের আসলে কোন গুরুত্ব নেই।
আবার আপনি একটি নির্দিষ্ট কমান্ড ম্যাচ করে ট্যাগ সার্চ করতে পারেন। ধরুন আপনার গিট সোর্সের রিপোতে ৫০০ এর বেশি ট্যাগ রয়েছে। এর মধ্য থেকে যদি আপনি 1.8.5 সিরিজটি খুঁজতে চান তবে নিম্নোক্ত কমান্ডটি রান করুন।
				
					$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5

				
			
নোট
যদি আপনি ট্যাগগুলোর সম্পূর্ণ লিস্ট চান তবে git tag কমান্ডটি ভেতরে ভেতরে ধরে নেয় যে, আপনি একটি লিস্ট চান এবং একটি প্রোভাইড করেছেন আর এক্ষেত্রে -l বা –list অপশনাল।
কিন্তু আপনি যদি একটি ওয়াইল্ডকার্ড প্যাটার্ন সাপ্লাই করে একটী ট্যাগ ম্যাচ করাতে চান তবে সেক্ষেত্রে -l or –list ব্যবহার করা বাধ্যতামূলক।

ট্যাগগুলোকে লিস্টিং করা

গিট ২ ধরনের ট্যাগ সাপোর্ট করে – লাইটওয়েট ও অ্যানোটেড।
লাইটওয়েট ট্যাগ একটা স্পেসিফিক কমেন্টের জন্য একটা পয়েন্টার । এটি মূলত একটি ট্যাগের নাম, ইমেইল ও ডেট কে ধারণ করে যা জিএনইউ প্রাইভেসি গার্ড(জিপিজি) দ্বারা সাইন্ড ও অ্যাপ্রোভড করা যায়। এসকল ইনফরমেশন পাওয়ার জন্য অ্যানোটেডট্যাগ ক্রিয়েট করা সাধারণত রিকোমেন্ডেড কিন্তু যদি কিছু ইনফমেশোন ধারণ করার প্রয়োজন নেই এমন চান সেক্ষেত্রে লাইটওয়েট ট্যাগ ব্যবহার করতে হবে।

ট্যাগগুলোকে লিস্টিং করা

tag কমান্ডের সাথে -a ব্যবহার করলেই অ্যানোটেড ট্যাগ ক্রিয়েট হয়ে যায়।
				
					$ git tag -a v1.4 -m "my version 1.4"
$ git tag
v0.1
v1.3
v1.4

				
			
-m ট্যাগিং ম্যাসেজকে স্পেসিফাই করে যা একটি নির্দিষ্ট ট্যাগের সাথে স্টোরড থাকে। আপনি যদি Annotated ট্যাগের সাথে কোন মেসেজকে স্পেসিফাই করে না দেন, তবে গিট আপনার জন্য একটি ইডিটর লঞ্চ করে দিবে যেখানে আপনি মেসেজটি টাইপ করতে পারেন। git show কমান্ডের মাধ্যমে আপনি কমিটের সাথে অন্তর্ভুক্ত ট্যাগ ডাটা দেখতে পারবেন।
				
					$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:19:12 2014 -0700

my version 1.4

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

				
			
এর মাধ্যমে আপনি কমিট ইনফরমেশন এর পূর্বে ট্যাগারের ইনফরমেশন, কমিট ট্যাগের তারিখ ও অ্যানোটেশন মেসেজ দেখতে পারবেন।

লাইটওয়েট ট্যাগ

কমিট ট্যাগ করার অন্য একটি উপায় হয় লাইটওয়েট ট্যাগ। এটি মূলত কমিটের একটি চেকসাম যা একটি ফাইলে স্টোরড করা হয় যেখানো কোন ইনফরমেশন ধরে রাখা হয় না। লাইটওয়েট ট্যাগ তৈরির জন্য -a, -s, or -m কোন অপশন সাপ্লাই করার দরকার হয় না শুধুমাত্র ট্যাগের নাম প্রোভাইড করাই যথেষ্ট।
				
					$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5

				
			
এবার যদি আপনি ট্যাগের পূর্বে git show কমান্ডটি ব্যবহার করেন তবে এক্ষেত্রে আপনি কোন অতিরিক্ত ট্যাগ ইনফরমেশন দেখতে পারবেন না।
				
					$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

				
			

পরবর্তীতে ট্যাগ করা

আপনি কমিট করার পরেও সেই কমিটটি ট্যাগ করতে পারেন। ধরুন, আপনার কমিট হিস্টোরিটি দেখতে নিম্নরুপ:
				
					$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 Create write support
0d52aaab4479697da7686c15f77a3d64d9165190 One more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc Add commit function
4682c3261057305bdd616e23b64b0857d832627b Add todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a Create write support
9fceb02d0ae598e95dc970b74767f19372d61af8 Update rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc Commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a Update readme

				
			
এখন যদি আপনি প্রজেক্টের v1.2 তে কমিটটি ট্যাগ করতে ভুলে যান যার নাম ছিল “আপডেট রেকফাইল” এবং পরবর্তীতে আপনি সেই কমিটটি ট্যাগ করতে চাইলে কমান্ডের শেষে কমিটের চেকসাম কে স্পেসিফাই করে দিতে হবে।
				
					$ git tag -a v1.2 9fceb02
				
			
আপনি যে কমিটগুলোকে ট্যাগ করেছেন তাদের আবার দেখতে পারবেন:
				
					$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5

$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Feb 9 15:32:16 2009 -0800

version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <mchacon@gee-mail.com>
Date:   Sun Apr 27 20:43:35 2008 -0700

    Update rakefile

				
			

ট্যাগ শেয়ার করা

ডিফল্টভাবে git push কমান্ডটি রিমোট সার্ভারে ট্যাগগুলোকে ট্রান্সফার করে না। শেয়ারড সার্ভারে একটি ট্যাগ ক্রিয়েট করার তাকে এক্সপ্লিসিটলি পুশ করতে হবে। এই প্রসেসটা অনেকটা রিমোট ব্রাঞ্চ শেয়ার করার মতন – যা এভাবে রান করতে হবে: git push origin <tagname>.

				
					$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.5 -> v1.5

				
			
যদি আপনি অনেকগুলো ট্যাগ একত্রে পুশ করতে চান, সেক্ষেত্রে আপনি git push কমান্ডের সাথে –tags কে অপশন হিসেবে ব্যববার করতে পারেন। এতে করে যেসকল ট্যাগ রিমোট সার্ভারে নেই, তারা সকলেই সেখানে পুশ হয়ে যাবে।
				
					$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.4 -> v1.4
 * [new tag]         v1.4-lw -> v1.4-lw

				
			
এবার যদি কেউ আপনার রিপোসিটরি ক্লোন বা পুল করে তবে সে তার সাথে আপনার ট্যাগগুলোও পেয়ে যাবে।
নোট

git push কমান্ডটি ২ ধরনের ট্যাগকেই পুশ করে।
git push <remote> –tags ট্যাগটি ২ ধরনের ট্যাগকেই পুশ করে। git push <remote> –follow-tags কমান্ডটি ব্যবহারের মাধ্যমে শুধুমাত্র annotated ট্যাগগুলোকে রিমোটে পুশ করতে পারেন কিন্তু লাইটওয়েট ট্যাগের ক্ষেত্রে এমন কোণ সুযোগ নেই।

ট্যাগ ডিলিট করা

লোকাল রিপোসিটরি থেকে একটী ট্যাগ ডিলিট করার জন্য আপনি git tag -d <tagname> কমান্ডটি ব্যবহার করতে পারেন। যেমন লাইটওয়েট ট্যাগকে নিম্নরূপে ডিলিট করা যায়:

				
					$ git tag -d v1.4-lw
Deleted tag 'v1.4-lw' (was e7d5add)

				
			

তবে এতে রিমোট সার্ভার থেকে ট্যাগ রিমোভ হয় না। রিমোট সার্ভার থেকে ট্যাগকে ডিলিট করার জন্য ২টা কমন ভ্যারিয়েশন রয়েছে:

১ম ভ্যারিয়েশনটি হল git push <remote> :refs/tags/<tagname>: কমান্ড:

				
					$ git push origin :refs/tags/v1.4-lw
To /git@github.com:schacon/simplegit.git
 - [deleted]         v1.4-lw

				
			

রিমোট ট্যাগ নামে কোলন পুশ করার পূর্ব পর্যন্ত নাল ভ্যালু হিসেবে রিড করে পরে সফলভাবে ডিলিট সম্পন্ন হয়। 

২ ভ্যারিয়েশনটি হল

				
					$ git push origin --delete <tagname>
				
			

ট্যাগ চেকআউট করা

আপনি যদি একটা ট্যাগ কোন ভার্শনের ফাইলগুলোকে পয়েন্ট করছে তা চেক করতে চান তবে আপনি ঐ ট্যাগের git checkout করতে পারেন যদিও তা আপনার রিপোজিটরিকে ডিটাচড HEAD স্টেট এ নিয়ে যায় যার কিছু খারাপ সাইড ইফেক্ট রয়েছে:
				
					$ git checkout v2.0.0
Note: switching to 'v2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

$ git checkout v2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... Add atlas.json and cover image

				
			
ডিটাচড HEAD স্টেটে যদি আপনি কোন চেঞ্জ করেন ও পরবর্তীতে কমিট ক্রিয়েট করেন তবে ট্যাগটা সেইমই থাকবে কিন্তু নির্দিষ্ট কমিট হ্যাশ ছাড়া নতুন কমিটটি কোন ব্রাঞ্চের অধীনে থাকবে না বরং অগম্য হয়ে যাবে। এভাবে যদি আপনি কোন কিছু পরিবর্তন করেন যেমন আপনি পুরোনো কোন একটি ভার্শনের কোন বাগ ফিক্স করতে চাচ্ছেন সেক্ষেত্রে সাধারণত আপনি একটি ব্রাঞ্চ ক্রিয়েট করবেন:
				
					$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

				
			


যদি আপনি এভাবে একটি কমিট ক্রিয়েট করেন তবে v2.0.0 ট্যাগ থেকে version2 ব্রাঞ্চটি কিছুটা ভিন্ন হবে যেহেতু আপনার নতুন পরিমার্জনের সাথে সাথে তা সামনে এগিয়ে যাচ্ছে। তাই এ বিষয়ে সচেতুন থাকতে হবে।