কোনও নির্দিষ্ট শব্দের জন্য কীভাবে গিট কমিট ডিফারেন্স বা বিষয়বস্তু গ্রেপ করবেন?


622

একটি গিট কোড ভাণ্ডারে আমি সমস্ত কমিটের তালিকাবদ্ধ করতে চাই যাতে একটি নির্দিষ্ট শব্দ থাকে। আমি এই চেষ্টা করেছিলাম

git log -p | grep --context=4 "word"

তবে এটি অগত্যা আমাকে ফাইলের নামটি ফেরত দেয় না (যদি না আমি সন্ধানী শব্দটি থেকে 5 লাইন দূরে থাকি তবে আমি চেষ্টা করেছিলাম)

git grep "word"

তবে এটি আমাকে কেবল বর্তমান ফাইল দেয় এবং ইতিহাস দেয় না।

আমি কীভাবে পুরো ইতিহাস অনুসন্ধান করব যাতে আমি একটি নির্দিষ্ট শব্দের পরিবর্তনগুলি অনুসরণ করতে পারি? আমি পরিবর্তনগুলি (ফাইলের ইতিহাসে সন্ধান করুন) ট্র্যাক করতে শব্দের সংঘটনগুলির জন্য আমার কোডবেস অনুসন্ধান করার ইচ্ছা করি।


উত্তর:


904

যদি আপনি সমস্ত কমিটগুলি সন্ধান করতে চান যেখানে প্রতিশ্রুতিবদ্ধ বার্তায় প্রদত্ত শব্দ রয়েছে, ব্যবহার করুন

$ git log --grep=word

আপনি যদি ফাইলের বিষয়বস্তুগুলিতে "শব্দ" যুক্ত বা মুছে ফেলা হয় তার সমস্ত কমিটগুলি সন্ধান করতে চান (আরও সঠিকভাবে বলা যায়: যেখানে "শব্দ" এর উপস্থিতির সংখ্যা পরিবর্তিত হয়েছে), যেমন প্রতিশ্রুতিবদ্ধ বিষয়বস্তু সন্ধান করুন, এর সাথে তথাকথিত 'পিক্সে' অনুসন্ধান ব্যবহার করুন

$ git log -Sword

আধুনিক গিট এছাড়াও আছে

$ git log -Gword

যার যুক্ত বা সরানো রেখাটি "শব্দ" (এছাড়াও সামগ্রীগুলি প্রতিশ্রুতিবদ্ধ) এর সাথে মেলে এমন পার্থক্যগুলি সন্ধান করতে ) এর সাথে ।

নোট করুন যে -Gডিফল্টরূপে একটি রেজেক্স গ্রহণ করে, যখন -Sএকটি স্ট্রিং গ্রহণ করে তবে এটিকে ব্যবহার করে রেজিক্সগুলি গ্রহণ করতে পরিবর্তন করা যেতে পারে --pickaxe-regex

-S<regex> --pickaxe-regexএবং এর মধ্যে পার্থক্য চিত্রিত করতে -G<regex>, একই ফাইলে নিম্নলিখিত ডিফের সাথে একটি অঙ্গীকার বিবেচনা করুন:

+    return !regexec(regexp, two->ptr, 1, &regmatch, 0);
...
-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

git log -G"regexec\(regexp"এই প্রতিশ্রুতি প্রদর্শন করার সময় , তা git log -S"regexec\(regexp" --pickaxe-regexকরবে না (কারণ সেই স্ট্রিংয়ের সংঘটনগুলির সংখ্যা পরিবর্তন হয়নি)।


গিট ২.২৫.১ (ফেব্রুয়ারি ২০২০) এর সাথে ডকুমেন্টেশনগুলিকে এই রেজেক্সগুলির চারপাশে স্পষ্ট করা হয়েছে।

দেখুন কমিট 9299f84 দ্বারা (06 ফেব্রুয়ারী 2020) মার্টিন Ågren ( ``)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 0d11410 , 12 ফেব্রুয়ারী 2020)

diff-options.txt: উদাহরণস্বরূপ "রেজেক্স" ওভারলোড এড়াতে পারেন

রিপোর্ট-বাই: অ্যাডাম
ডাইনউডি সই-অফ-বাই: মার্টিন অ্যাগ্রেন
পর্যালোচনা করেছেন: টেলর ব্লু

যখন আমরা -Gএবং -S(ব্যবহারের --pickaxe-regex) মধ্যে পার্থক্যটির উদাহরণ দিয়ে থাকি, তখন আমরা git diff"রেজেক্সেক", "রেজিএক্সএক্স", "রেজিমেচ", ... এর সাথে জড়িত একটি উদাহরণ এবং অনুরোধ ব্যবহার করে তা করি ...

উদাহরণটি সঠিক, তবে আমরা "রেইজেক্স। *" লেখা এড়িয়ে চলাচলকে আরও সহজ করে তুলতে পারি যদি না এটি সত্যই আমাদের বিষয়টির প্রয়োজন হয় না।

পরিবর্তে কিছু মেক-আপ, নন-রেজি্সি শব্দ ব্যবহার করুন।

git diffডকুমেন্টেশন এখন রয়েছে:

-S<regex> --pickaxe-regexএবং এর মধ্যে পার্থক্য চিত্রিত করতে -G<regex>, একই ফাইলে নিম্নলিখিত ডিফের সাথে একটি অঙ্গীকার বিবেচনা করুন:

+    return frotz(nitfol, two->ptr, 1, 0);
...
-    hit = frotz(nitfol, mf2.ptr, 1, 0);

git log -G"frotz\(nitfol"এই প্রতিশ্রুতি প্রদর্শন করার সময় , তা git log -S"frotz\(nitfol" --pickaxe-regexকরবে না (কারণ সেই স্ট্রিংয়ের সংঘটনগুলির সংখ্যা পরিবর্তন হয়নি)।


3
@ ট্যাঙ্কোরস্যামশ -S<string><< স্ট্রিং> এর একটি উদাহরণ পরিচয় করিয়ে দিতে বা সরিয়ে দিতে পার্থক্যগুলি সন্ধান করুন। -G<string>পার্থক্য সন্ধান করুন যার যুক্ত বা সরানো রেখা প্রদত্ত <রিজেেক্স> এর সাথে মেলে।
এম ধনী

1
@ এম-রিচ ওহ, আমি দেখছি, একটি একক স্ট্রিং উদাহরণ বনাম পুরো লাইন! ধন্যবাদ
TankorSmash

3
@ এম-রিচ, @ ট্যাঙ্কারস্যামশ: পার্থক্যটি এটি -S<string>তাত্পর্যপূর্ণ কারণ এটি কেবলমাত্র পরীক্ষা করে দেখেছে যে সংখ্যার <string>পরিবর্তন হয়েছে কি না, যখন -G<string>অনুসন্ধানগুলি প্রতিটি প্রতিশ্রুতিতে পৃথক এবং যুক্ত লাইনটি পৃথক করে।
জাকুব নরবস্কি

3
আপনার যদি মাঝে মাঝে জায়গাগুলির সাথে শব্দগুলি অনুসন্ধান করতে হয় git log --grep="my words",।
এমইএম

4
@ এমইএম, এবং এর --grepথেকে পৃথক । আপনি এই প্রতিটি আর্গুমেন্টের স্ট্রিংটি উদ্ধৃত করতে পারেন। -S-G
একিউম্যানাস

255

git logএর পিক্যাক্সটি "শব্দ" সহ পরিবর্তন সহ কমিটগুলি সন্ধান করবে git log -Sword


60
এটি পুরোপুরি সুনির্দিষ্ট নয়। -এস <স্ট্রিং> পার্থক্যগুলি সন্ধান করুন যা <স্ট্রিং> এর একটি উদাহরণ পরিচয় করিয়ে দেয় বা সরিয়ে দেয়। দ্রষ্টব্য যে এটি স্ট্রিংয়ের চেয়ে পৃথক আউটপুটে প্রদর্শিত কেবল পৃথক;
tymtam

4
যদিও এটি সঠিকভাবে সঠিক উত্তর, আমি কেবল এই উত্তরটি পড়ার জন্য অন্যকে উত্সাহিত করার জন্য ( স্ট্যাকওভারফ্লো. com/a/1340245/ 586983 ) ডাউনভোট করেছি যার 3 টি ভিন্ন উপায় রয়েছে এবং তাদের সূক্ষ্মতা ব্যাখ্যা করে।
jakeonrails

18
ভগবন্! আমি মনে করি না যে এটি সঠিক উত্তরকে হ্রাস করার পক্ষে একটি ভাল কারণ ... আপনি কোনও মন্তব্যে লিঙ্ক সহ আত্মবিশ্বাসী ছিলেন না যে যথেষ্ট উত্সাহ হবে?
দেবোরাহ

@ জ্যাকোনরাইলস, এই উত্তরটি এই (পুরানো) একের সম্পাদনা হওয়া উচিত ছিল, সুতরাং আমাদের কাছে এই বিরক্তিকর সদৃশগুলি নেই। তবে লোকেরা কেবল পরিষ্কার উত্তর পৃষ্ঠার পরিবর্তে খ্যাতি চায়।
Iulian Onofrei

22

প্রচুর পরীক্ষার পরে, আমি নিম্নলিখিতগুলি সুপারিশ করতে পারি, যা প্রদত্ত রেজিএক্সপ্যাকসযুক্ত লাইনগুলিকে পরিচয় করিয়ে দেয় বা সরিয়ে দেয় এমন প্রতিশ্রুতি প্রদর্শন করে এবং প্রতিটিটিতে বর্ণ যুক্ত করে এবং মুছে ফেলা রঙগুলি প্রদর্শন করে।

git log --pickaxe-regex -p --color-words -S "<regexp to search for>"

যদিও চালাতে কিছুটা সময় নেয় ... ;-)


2
এটি এখন পর্যন্ত অন্যতম সেরা ধন্যবাদ। ইঙ্গিত: কেবল পেজিং ছাড়াই সমস্ত ফলাফলের তালিকা তৈরি করতে, হয় কমান্ডটি GIT_PAGER=catযুক্ত করুন বা এটি যুক্ত করুন| cat
জ্যাক মরিস

কোনও পাথ উল্লেখ করুন বা ফাইলটি আরও দ্রুত হবেgit log --pickaxe-regex -p --color-words -S "<regexp to search for>" <file or fiepath>
56

10

আপনি নিম্নলিখিত আদেশটি চেষ্টা করতে পারেন:

git log --patch --color=always | less +/searching_string

বা grepনিম্নলিখিত উপায়ে ব্যবহার :

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'

এই কমান্ডটি প্যারেন্ট ডিরেক্টরিতে চালান যেখানে আপনি অনুসন্ধান করতে চান।


2
আমি এই পদ্ধতিটি পছন্দ করি কারণ আমি যে শৃঙ্খলাগুলি দেখছি তাতে শতভাগ লাইন অবিলম্বে পরিবর্তিত পরিবর্তন রয়েছে এবং আমি কেবল প্রকৃত প্যাচগুলিতে আগ্রহী যা আমি সন্ধান করছি এই শব্দটির সাথে জড়িত। রঙ ব্যবহার পেতে git log --patch --color=always | less +/searching_string
রেডন রোসবারো

9

এটি করার আরও একটি উপায় / বাক্য গঠন: এটির git log -S "word"
মতো আপনি উদাহরণস্বরূপ অনুসন্ধান করতে পারেনgit log -S "with whitespaces and stuff @/#ü !"


1

তেজ-পলাতক তেজ মধ্যে পরীক্ষা যে ধরনের জন্য বহুমুখী।

এটি করতে ব্যবহার করুন :Ggrep। আরও তথ্যের জন্য আপনি ভিএম-পলাতক ইনস্টল করতে পারেন এবং এর মাধ্যমে টিউরিয়ালটি সন্ধান করতে পারেন :help Grep। এবং এই পর্ব: এক্সপ্লোরার-দ্য হিস্ট্রি-অফ-এ-গিট-রিপোজিটরি আপনাকে সে সমস্ত করার জন্য গাইড করবে।


1

নিয়মিত অভিব্যক্তিগুলিতে বুলিয়ান সংযোগকারী ব্যবহার করতে:

git log --grep '[0-9]*\|[a-z]*'

এই নিয়মিত অভিব্যক্তি অনুসন্ধান প্রতিশ্রুতিবদ্ধ বার্তাগুলিতে নিয়মিত অভিব্যক্তি [0-9] * বা [অ্যাজ] *।


-1

আপনার গিট ইতিহাস থেকে মুছে ফেলার জন্য আপনি যদি সংবেদনশীল ডেটা অনুসন্ধান করতে চান (যে কারণেই আমি এখানে অবতরণ করেছি) তবে এর জন্য সরঞ্জাম রয়েছে। এই ইস্যুটির জন্য ডেডিকেটেড সহায়তা পৃষ্ঠা হিসাবে গিথুব

এখানে নিবন্ধটির সংক্ষিপ্তসার:

BFG রেপো-ক্লিনার একটি দ্রুততর, সহজতর অবাঞ্ছিত ডেটা সরানোর জন্য Git ফিল্টার-শাখায় বিকল্প। উদাহরণস্বরূপ, সংবেদনশীল ডেটা সহ আপনার ফাইলটি সরিয়ে ফেলতে এবং আপনার সর্বশেষ প্রতিশ্রুতিটি ছোঁয়া ছেড়ে দেওয়া) চালনা করুন:

bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA

পাসওয়ার্ডে তালিকাভুক্ত সমস্ত পাঠ্য প্রতিস্থাপন করতে। টেক্সট যেখানে এটি আপনার সংগ্রহশালার ইতিহাসে পাওয়া যাবে, চালনা করুন:

bfg --replace-text passwords.txt

দেখুন BFG রেপো-ক্লিনার এর ডকুমেন্টেশন সম্পূর্ণ ব্যবহার এবং ডাউনলোড নির্দেশাবলীর জন্য।


আপনি এই উত্তর যোগ ওয়ানা পারে stackoverflow.com/questions/872565/... এখানে পরিবর্তে
lacostenycoder
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.