git - কিভাবে grep(অনুসন্ধান) গিট ইতিহাসে প্রতিশ্রুতিবদ্ধ কোড?




diff (9)

আমি অতীতে একটি ফাইল একটি ফাইল বা কিছু কোড মুছে ফেলা হয়েছে। আমি কন্টেন্ট মধ্যে grep করতে পারেন (প্রেরণ বার্তা নয়)?

একটি খুব খারাপ সমাধান লগ grep হয়:

git log -p | grep <pattern>

তবে এই সরাসরি কমিটি হ্যাশ ফিরে না। আমি git grep সঙ্গে কোন উপকারে প্রায় অভিনয়।


@ জিত এর উত্তর পাওয়ারশেলে কাজ করে।

git grep -n <regex> $(git rev-list --all)

নিম্নলিখিত সমস্ত ফাইল, কোনও কমিটিতে, যা একটি password ধারণ করে।

# store intermediate result
$result = git grep -n "password" $(git rev-list --all)

# display unique file names
$result | select -unique { $_ -replace "(^.*?:)|(:.*)", "" }

আপনি git log পিকএক্সে ( -S ) বিকল্প ব্যবহার করতে হবে

Foo জন্য অনুসন্ধান করুন:

git log -SFoo -- path_containing_change 
git log -SFoo --since=2009.1.1 --until=2010.1.1 -- path_containing_change

গিট ইতিহাস দেখুন - আরো জন্য কীওয়ার্ড দ্বারা হারিয়ে লাইন খুঁজে

জাকুব নরবেস্কি মন্তব্য করেছেন:

  • এই <string> এর একটি উদাহরণ পরিচয় করানো বা সরাতে পার্থক্যের সন্ধান করে
    এটি সাধারণত "Foo" দিয়ে আপনি যুক্ত বা সরানো লাইন যেখানে সংশোধনগুলি "।

  • --pickaxe-regex বিকল্পটি আপনাকে একটি স্ট্রিং অনুসন্ধানের পরিবর্তে বর্ধিত POSIX regex ব্যবহার করতে দেয়।

Rob মন্তব্য করেছেন যে, এই অনুসন্ধানটি কেস-সংবেদনশীল হয় - সে ক্ষেত্রে কীভাবে কেস-অসংবেদক অনুসন্ধান করা যায় তার উপর একটি ফলোআপ প্রশ্ন খোলা।


আমি জিটের উত্তরটি গ্রহণ করেছিলাম এবং উইন্ডোজ এ এটিকে প্রশংসা করেছি ( এই উত্তরটির জন্য ধন্যবাদ):

FOR /F %x IN ('"git rev-list --all"') DO @git grep <regex> %x > out.txt

মনে রাখবেন, আমার জন্য, কোন কারণে, এই রেজেক্সটি মুছে ফেলা প্রকৃত কমিটি কমান্ডের আউটপুটে উপস্থিত হয় নি, বরং এটির পূর্বে একটি কমিটি প্রদর্শিত হয়।


এটি করার আমার প্রিয় উপায়টি গিট লোগো- -G বিকল্প (সংস্করণ 1.7.4 এ যোগ করা হয়েছে)।

-G<regex>
       Look for differences whose added or removed line matches the given <regex>.

-G এবং -S বিকল্পগুলি একটি সংঘবদ্ধ মিলের সাথে নির্ধারণের -G মধ্যে একটি সূক্ষ্ম পার্থক্য রয়েছে:

  • -S বিকল্পটি মূলত আপনার অনুসন্ধানের আগে এবং পরে কোনও ফাইলে আপনার অনুসন্ধানের সাথে মিলিত হওয়ার সংখ্যা গণনা করে। আগে এবং পরে গণনা পৃথক হলে কমিটিতে লগ দেখানো হয়। এটি, উদাহরণস্বরূপ, এমন কিছু দেখাবে না যেখানে আপনার অনুসন্ধানের সাথে মেলে এমন একটি লাইন সরানো হয়েছিল।
  • -G বিকল্পের সাথে, যদি আপনার অনুসন্ধান যুক্ত, সরানো, বা পরিবর্তিত যে কোনও লাইনের সাথে মেলে তবে সংঘটিত -G দেখানো হয়।

উদাহরণ হিসাবে এই প্রতিশ্রুতি নিন:

diff --git a/test b/test
index dddc242..60a8ba6 100644
--- a/test
+++ b/test
@@ -1 +1 @@
-hello hello
+hello goodbye hello

কারণ ফাইলটিতে "হ্যালো" বার প্রদর্শিত সংখ্যাটি এই -Shello আগে এবং পরে একই রকম, এটি -Shello ব্যবহার করে -Shello । যাইহোক, যেহেতু hello মিলে একটি লাইন পরিবর্তন হয়েছে, তাই -Ghello ব্যবহার করে দেখানো হবে।


যদি আপনি কোড পরিবর্তনগুলি ব্রাউজ করতে চান (সমগ্র ইতিহাসে দেওয়া শব্দটির সাথে আসলে কী পরিবর্তন হয়েছে তা দেখুন) patch মোডের জন্য যান - আমি এটি করার একটি খুব কার্যকর সমন্বয় খুঁজে পেয়েছি:

git log -p
# hit '/' for search mode
# type in the word you are searching
# if the first search is not relevant hit 'n' for next (like in vim ;) )

সরলতার জন্য, আমি GUI ব্যবহার করে সুপারিশ করব: gitk - Git repository ব্রাউজার , এটি বেশ সুন্দর

  1. কোড অনুসন্ধান করতে:
  2. ফাইল অনুসন্ধান করুন:
  3. কারণ এটি regex সমর্থন করে:

এবং আপনি আপ / ডাউন তীর ব্যবহার করে ফলাফলের মাধ্যমে নেভিগেট করতে পারেন


git log সমস্ত শাখা জুড়ে পাঠ্য অনুসন্ধানের আরো কার্যকর উপায় হতে পারে, বিশেষ করে যদি অনেক মিল রয়েছে এবং আপনি আরও সাম্প্রতিক (প্রাসঙ্গিক) পরিবর্তনগুলি প্রথমে দেখতে চান।

git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'

এই লগ কমান্ডের তালিকাগুলি দেওয়া হয়েছে যে প্রদত্ত অনুসন্ধান স্ট্রিং / রেজেক্সটি যোগ করে বা সরান, (সাধারণত) আরো সাম্প্রতিক প্রথম। -p বিকল্পটি প্রাসঙ্গিক বিভাজনটি দেখায় যেখানে প্যাটার্ন যোগ করা হয়েছে বা সরানো হয়েছে, যাতে আপনি প্রসঙ্গে এটি দেখতে পারেন।

কোনও প্রাসঙ্গিক কমিটি খুঁজে পেয়েছেন যা আপনি খুঁজছেন এমন পাঠ্য যোগ করে (যেমন, 8beeff00d), এমন শাখাগুলি খুঁজুন যা কমিটি ধারণ করে:

git branch -a --contains 8beeff00d

কোন সংশোধন, কোন ফাইল অনুসন্ধান করুন :

git rev-list --all | xargs git grep <regexp>

কিছু প্রদত্ত ফাইলগুলিতে অনুসন্ধান করুন, উদাহরণস্বরূপ xml ফাইলগুলি:

git rev-list --all | xargs -I{} git grep <regexp> {} -- "*.xml"

ফলাফল লাইন এইরকম হওয়া উচিত: 6988bec26b1503d45eb0b2e8a4364afb87dde7af: bla.xml: লাইনের পাঠ্য এটি পাওয়া গেছে ...

তারপর আপনি git শো ব্যবহার করে লেখক, তারিখ, diff মত আরো তথ্য পেতে পারেন:

git show 6988bec26b1503d45eb0b2e8a4364afb87dde7af

git rev-list --all | xargs -n 5 git grep EXPRESSION

@ জিট এর সমাধানটি একটি টিমাক যাতে এটি ফলাফলগুলি দেখায় এবং শেষ পর্যন্ত নয় (যা একটি বড় রেপোতে দীর্ঘ সময় নিতে পারে)।





diff