৭.৫ গিট টুলস – সার্চিং

সার্চিং

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

গিট গ্রেপ 

গিট grep নামক একটি কমান্ড পরিচয় করিয়ে দেয় যা আপনাকে যেকোন কমিটেড ট্রি, ওয়ার্কিং ডিরেক্টরি, এমনকি একটি স্ট্রিং বা রেগুলার এক্সপ্রেশনের ইনডেক্সের মাধ্যমে সহজেই অনুসন্ধান করতে দেয়। অনুসরণ করা উদাহরণগুলির জন্য, আমরা গিটের নিজের জন্যেই সোর্স কোডের মধ্যে অনুসন্ধান করব।

ডিফল্ট ভাবেই, git grep আপনার ওয়ার্কিং ডিরেক্টরির ফাইলগুলি দেখবে। প্রথম প্রকরণ হিসাবে, আপনি গিট মিল খুঁজে পেয়েছে এমন লাইন নম্বরগুলি মুদ্রণ করতে -n বা –line-number অপশনগুলির মধ্যে একটি ব্যবহার করতে পারেন:

				
					$ git grep -n gmtime_r
compat/gmtime.c:3:#undef gmtime_r
compat/gmtime.c:8:      return git_gmtime_r(timep, &result);
compat/gmtime.c:11:struct tm *git_gmtime_r(const time_t *timep, struct tm *result)
compat/gmtime.c:16:     ret = gmtime_r(timep, result);
compat/mingw.c:826:struct tm *gmtime_r(const time_t *timep, struct tm *result)
compat/mingw.h:206:struct tm *gmtime_r(const time_t *timep, struct tm *result);
date.c:482:             if (gmtime_r(&now, &now_tm))
date.c:545:             if (gmtime_r(&time, tm)) {
date.c:758:             /* gmtime_r() in match_digit() may have clobbered it */
git-compat-util.h:1138:struct tm *git_gmtime_r(const time_t *, struct tm *);
git-compat-util.h:1140:#define gmtime_r git_gmtime_r
				
			

উপরে দেখানো বেসিক সার্চিং ছাড়াও, git grep অন্যান্য আকর্ষণীয় অপশনগুলির আধিক্য সমর্থন করে।

উদাহরণস্বরূপ, সমস্ত মিল প্রিন্ট করার পরিবর্তে, আপনি git grep-কে  -c বা –count বিকল্পের মাধ্যমেই শুধুমাত্র কোন ফাইলে সার্চ স্ট্রিং রয়েছে এবং প্রতিটি ফাইলে কতগুলি মিল রয়েছে তা দেখিয়ে, আউটপুট সংক্ষিপ্ত করতে বলতে পারেন:

				
					$ git grep --count gmtime_r
compat/gmtime.c:4
compat/mingw.c:1
compat/mingw.h:1
date.c:3
git-compat-util.h:2
				
			

আপনি যদি একটি সার্চ স্ট্রিং এর প্রসঙ্গে আগ্রহী হন, তাহলে আপনি -p বা –show-function অপশনগুলির যেকোনো একটির মাধ্যমে প্রতিটি ম্যাচিং স্ট্রিং এর জন্য এনক্লোসিং মেথড বা ফাংশন প্রদর্শন করতে পারেন:

				
					$ git grep -p gmtime_r *.c
date.c=static int match_multi_number(timestamp_t num, char c, const char *date,
date.c:         if (gmtime_r(&now, &now_tm))
date.c=static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt)
date.c:         if (gmtime_r(&time, tm)) {
date.c=int parse_date_basic(const char *date, timestamp_t *timestamp, int *offset)
date.c:         /* gmtime_r() in match_digit() may have clobbered it */
				
			

আপনি দেখতে পাচ্ছেন, date.c ফাইলের match_multi_number এবং match_digit উভয় ফাংশন থেকে gmtime_r রুটিন কল করা হয়েছে  ( প্রদর্শিত তৃতীয় ম্যাচটি শুধুমাত্র একটি মন্তব্যে প্রদর্শিত স্ট্রিংকে প্রতিনিধিত্ব করে )।

 

আপনি –and ফ্ল্যাগের মাধ্যমে স্ট্রিংগুলির জটিল কম্বিনেশানগুলিকেও অনুসন্ধান করতে পারেন, যা নিশ্চিত করে যে টেক্সটের একই লাইনে একাধিক মিল ঘটতেই হবে। উদাহরণ স্বরূপ, আসুন এমন যেকোন লাইনের সন্ধান করা যাক যা একটি কনস্ট্যান্টকে সংজ্ঞায়িত করে, যে কন্সট্যান্টটির নামটি সাবস্ট্রিং “LINK” বা “BUF_MAX” এর মধ্যে একটি ধারণ করে, বিশেষত v1.8.0 ট্যাগ দ্বারা উপস্থাপিত গিট কোডবেসের একটি পুরানো সংস্করণে। ( আমরা –break এবং –heading অপশন ব্যবহার করবো যা আউটপুটকে আরও পাঠযোগ্য বিন্যাসে বিভক্ত করতে সাহায্য করে ):

				
					$ git grep --break --heading \
    -n -e '#define' --and \( -e LINK -e BUF_MAX \) v1.8.0
v1.8.0:builtin/index-pack.c
62:#define FLAG_LINK (1u<<20)

v1.8.0:cache.h
73:#define S_IFGITLINK  0160000
74:#define S_ISGITLINK(m)       (((m) & S_IFMT) == S_IFGITLINK)

v1.8.0:environment.c
54:#define OBJECT_CREATION_MODE OBJECT_CREATION_USES_HARDLINKS

v1.8.0:strbuf.c
326:#define STRBUF_MAXLINK (2*PATH_MAX)

v1.8.0:symlinks.c
53:#define FL_SYMLINK  (1 << 2)

v1.8.0:zlib.c
30:/* #define ZLIB_BUF_MAX ((uInt)-1) */
31:#define ZLIB_BUF_MAX ((uInt) 1024 * 1024 * 1024) /* 1GB */
				
			

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

 

গিট লগ অনুসন্ধান

 

সম্ভবত আপনি একটি টার্ম কোথায় আছে তা খুঁজছেন না, কিন্তু কখন এটি অধিষ্ট বা উপস্থাপিত হয়েছিল, তা খুঁজছেন। git log কমান্ডে তাদের বার্তার বিষয়বস্তু বা এমনকি তারা যে ভিন্নতা উপস্থাপিত করে, তার বিষয়বস্তু দ্বারা নির্দিষ্ট কমিটগুলিকে খুঁজে বের করার জন্য বেশ কয়েকটি শক্তিশালী সরঞ্জাম রয়েছে।

 

উদাহরণস্বরূপ, যদি আমরা জানতে চাই যে ZLIB_BUF_MAX কনস্ট্যান্টটি আসলে কখন অরিজিনালি  উপস্থাপিত হয়েছিল, আমরা -S অপশনটি ব্যবহার করতে পারি  ( সচরাচর এটিকে গিট “পিক্যাক্স” অপশন হিসাবে উল্লেখ করা হয় ) গিটকে শুধুমাত্র সেই কমিটগুলি দেখাতে বলা হয়েছে যা সেই স্ট্রিংয়ের সংঘটনের সংখ্যা পরিবর্তন করেছে।

				
					$ git log -S ZLIB_BUF_MAX --oneline
e01503b zlib: allow feeding more than 4GB in one go
ef49a7a zlib: zlib can only process 4GB at a time
				
			

আমরা যদি এই কমিটগুলির পার্থক্য দেখি, আমরা দেখতে পাব যে ef49a7a তে কনস্ট্যান্টটি চালু করা হয়েছিল এবং e01503b তে এটি পরিবর্তন করা হয়েছিল।

আপনি যদি আরও নিশ্চিত হতে চান, আপনি -G বিকল্পের সাহায্যে অনুসন্ধান করার জন্য একটি রেগুলার এক্সপ্রেশন প্রদান করতে পারেন।

লাইন লগ অনুসন্ধান 

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

উদাহরণস্বরূপ, যদি আমরা zlib.c ফাইলে git_deflate_bound ফাংশনে করা প্রতিটি পরিবর্তন দেখতে চাই, তাহলে আমরা git log -L :git_deflate_bound:zlib.c চালাতে পারি। এটি সেই ফাংশনের সীমানাগুলি কী তা খুঁজে বের করার চেষ্টা করবে এবং তারপরে ইতিহাসের দিকে তাকাবে এবং ফাংশনটি প্রথম তৈরি করার সময় প্যাচগুলির একটি সিরিজ হিসাবে ফাংশনে করা প্রতিটি পরিবর্তন আমাদের দেখাবে।

				
					$ git log -L :git_deflate_bound:zlib.c
commit ef49a7a0126d64359c974b4b3b71d7ad42ee3bca
Author: Junio C Hamano <gitster@pobox.com>
Date:   Fri Jun 10 11:52:15 2011 -0700

    zlib: zlib can only process 4GB at a time

diff --git a/zlib.c b/zlib.c
--- a/zlib.c
+++ b/zlib.c
@@ -85,5 +130,5 @@
-unsigned long git_deflate_bound(z_streamp strm, unsigned long size)
+unsigned long git_deflate_bound(git_zstream *strm, unsigned long size)
 {
-       return deflateBound(strm, size);
+       return deflateBound(&strm->z, size);
 }


commit 225a6f1068f71723a910e8565db4e252b3ca21fa
Author: Junio C Hamano <gitster@pobox.com>
Date:   Fri Jun 10 11:18:17 2011 -0700

    zlib: wrap deflateBound() too

diff --git a/zlib.c b/zlib.c
--- a/zlib.c
+++ b/zlib.c
@@ -81,0 +85,5 @@
+unsigned long git_deflate_bound(z_streamp strm, unsigned long size)
+{
+       return deflateBound(strm, size);
+}
+


				
			

যদি গিট আপনার প্রোগ্রামিং ভাষায় একটি ফাংশন বা মেথডে কীভাবে মিল খুঁজে বের করতে হয় তা বের করতে না পারে, তবে আপনি এটিকে একটি রেগুলার এক্সপ্রেশন  ( বা রেজেক্স ) প্রদান করতে পারেন। উদাহরণস্বরূপ, এটি উপরের উদাহরণের মতো একই কাজ করবে: 

git log -L ‘/unsigned long git_deflate_bound/’,/^}/:zlib.c 

আপনি এটিকে একটি রেঞ্জ বা একক লাইন নম্বরও দিতে পারেন এবং আপনি একই ধরণের আউটপুট পাবেন।