গিট ব্যবহার করে, আমি কীভাবে সমস্ত শাখায় একটি স্ট্রিং সন্ধান করতে পারি?


170

গিট ব্যবহার করে, প্রদত্ত স্ট্রিংয়ের জন্য আমি কীভাবে সমস্ত স্থানীয় শাখায় সমস্ত ফাইলের মধ্যে অনুসন্ধান করতে পারি?

গিটহাব সুনির্দিষ্ট: সমস্ত গিটহাব শাখা জুড়ে উপরের অনুসন্ধানটি করা কি সম্ভব? (আমার দূরবর্তী গিটহাবের সংগ্রহস্থলে কয়েকটি রিমোট শাখা রয়েছে যে আদর্শভাবে আমাকে এই অনুসন্ধানের জন্য নামাতে হবে না ...)


1
Git-, grep হতে পারে আপনি যা খুঁজছেন তা, কিন্তু আমি নিশ্চিত এখনো যা অপশন আপনি প্রয়োজন চাই নই ...
জনি

উত্তর:


170

আপনি গিট সংগ্রহস্থলটিতে এটি করতে পারেন:

git grep "string/regexp" $(git rev-list --all)

গিটহাব উন্নত অনুসন্ধানে কোড অনুসন্ধানের ক্ষমতা রয়েছে:

কোড অনুসন্ধান সর্বজনীন গিটহাবটিতে হোস্ট করা কোডের মধ্যে দিয়ে দেখবে। আপনি এটি দ্বারাও ফিল্টার করতে পারেন:

  • ভাষা: language:
  • সংগ্রহস্থলের নাম (ব্যবহারকারীর নাম সহ): repo:
  • ফাইল পাথ: path:

এটি আমার বিভাজন ত্রুটি ঘটায়। যদিও হতে পারে কচ্ছপীয় গির্জার (উইন্ডোজ)।
বিন 5

6
এটি এটি করার সর্বোত্তম উপায় নয়। এটি গিট রেফগুলি যে পরিমাণে পাস করেছে তা নিয়ন্ত্রণ করে না git grep ...। অন্যান্য উত্তরের দিকে তাকান, এটি গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করা সত্ত্বেও তারা এগুলির চেয়ে অনেক ভাল!
slm

1
এটি দুর্দান্ত হবে যদি আপনি আপনার ফিল্টারগুলির জন্য উদাহরণ যুক্ত করতে পারেন, উদাহরণস্বরূপ path:, কারণ এক নজরে ডকুমেন্টেশনটি পরিষ্কার করে দেখায় না কোথায় এই ফিল্টারটি প্রয়োগ করতে হবে, আমি আপনার ক্যোয়ার উদাহরণে উদ্ধৃতিগুলির আগে এটি ধরে নিচ্ছি?
ব্লেম

3
আমি কীভাবে কেবল শাখার নাম তালিকাভুক্ত করতে পারি। বর্তমানে, এটি সমস্ত হ্যাশটিতে স্ট্রিং রয়েছে list
হ্যারিফেং

4
গিথুব অনুসন্ধান কেবলমাত্র মাস্টার শাখায় রয়েছে । সহায়তা. github.com/articles/searching-code থেকে : "কোড অনুসন্ধানের জন্য কেবলমাত্র ডিফল্ট শাখাটি সূচী করা হয় most বেশিরভাগ ক্ষেত্রেই এটি মাস্টার শাখা।"
রেডপান্ডা

124

আপনি যদি @ manojlds Git grep কমান্ডটি ব্যবহার করেন এবং ত্রুটি পান:

-bash: /usr/bin/git: Argument list too long" 

তাহলে আপনার xargs ব্যবহার করা উচিত :

git rev-list --all | xargs git grep "string/regexp"

আরো দেখুন গীত ইতিহাসে grep কিভাবে (অনুসন্ধান) অঙ্গীকারবদ্ধ কোড


এছাড়াও, এটি ফিশশেলের মতো অন্যান্য ধরণের কনসোলগুলির সাথে আরও সুসংগত বলে মনে হয়
ড্যানিয়েল

1
ধন্যবাদ !!! জেডএসএইচ ব্যবহার করে এটি কাজ করেছে যখন @manojlds কমান্ডটি আপনার উল্লিখিত ত্রুটিটি দিয়েছে! তবে সতর্কতা, দীর্ঘ ইতিহাস সহ বৃহত্তর রেপোতে এটি অনেক বেশি সময় নিতে পারে।
lacostenycoder

54

git rev-list --allস্ক্যান করতে চিরকালের জন্য অনেক ক্ষেত্রেই প্রচুর সংখ্যক কমিট ফিরিয়ে দিতে পারে। আপনি যদি আপনার ভাণ্ডার ইতিহাসের প্রতিটি শাখায় প্রতিটি প্রতিশ্রুতি অনুসন্ধানের পরিবর্তে সমস্ত শাখার টিপস সন্ধান করতে চান তবে আপনি এটির সাথে প্রতিস্থাপন করতে পারেন git show-ref --heads। সুতরাং মোট:

git grep "string" `git show-ref --heads`

বা:

git show-ref --heads | xargs git grep "string"

টিপ: একটি সম্পাদক এ ফাইল দেখতে আউটপুট লিখতে পারেন:

nano ~/history.txt
git show-ref --heads | xargs git grep "search string here" >> ~/history.txt

6
git show-ref --headsহ্যাশ এবং রেফের নাম তালিকাভুক্ত করে যাতে এটি (২ য় লাইন) দু'বার অনুসন্ধান করবে। তাই git show-ref --heads | cut -d' ' -f2ভাল হিসাবে এটি শুধুমাত্র সুত্র নাম তালিকাবদ্ধ করা হবে।
hIpPy

4
এই প্রশ্নটি কতবার জিজ্ঞাসা করা হয়েছে এবং উত্তর দেওয়া হয়েছে তা আমি বিশ্বাস করতে পারি না, তবুও আপনি সঠিক উত্তর সহ একমাত্র ব্যক্তি ।
সাম্মিচ

1
git show-ref --heads -sকেবল SHA1 হ্যাশ আউটপুট করে। এছাড়াও, যদি একই প্রতিশ্রুতিটির দিকে ইশারা করে একাধিক শাখা থাকে, তবে আপনার সদৃশ হবে। আপনি এগুলি দিয়ে এগুলি সরাতে sort -uপারেনgit show-ref --heads -s | sort -u | xargs git grep ...
স্টিভ

এখানে আমি আমার বাশক্রিতে যুক্ত ফাংশনটি দিচ্ছি। আশা করি এটি কাউকে সাহায্য করবে:function gsearch { git grep $1 $(git show-ref --heads) | grep "refs/heads" | grep $1 } # last grep to keep grep color highlight
এএফপি_৫৫৫

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। সমস্ত শাখায় স্ট্রিংকে গ্রিপিং করা তবে কেবল সর্বশেষতম সামগ্রীর জন্য খুব সাধারণ ব্যবহারের ক্ষেত্রে।
dr_

21

এখানে তালিকাভুক্ত সমাধানগুলির সাথে কয়েকটি সমস্যা রয়েছে (এমনকি স্বীকৃতও)।

ডুপ্লিকেট পাবেন বলে আপনাকে সমস্ত হ্যাশ তালিকাভুক্ত করার দরকার নেই। এছাড়াও, এটি আরও সময় নেয়।

এটা এই উপর তৈরী করে যেখানে আপনি একটি স্ট্রিং অনুসন্ধান করতে পারেন "test -f /"একাধিক শাখা উপর masterএবং devযেমন

git grep "test -f /" master dev

যা হিসাবে একই

printf "master\ndev" | xargs git grep "test -f /"

সুতরাং এখানে যায়।

এটি সমস্ত স্থানীয় শাখার অগ্রভাগের জন্য হ্যাশগুলি সন্ধান করে এবং কেবল সেই প্রতিশ্রুতিগুলিতে অনুসন্ধান করে:

git branch -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"

আপনার যদি খুব দূরবর্তী শাখাগুলিতেও অনুসন্ধান করতে হয় তবে যুক্ত করুন -a:

git branch -a -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"

আরও:

# Search in local branches
git branch | cut -c3- | xargs git grep "string"

# Search in remote branches
git branch -r | cut -c3- | xargs git grep "string"

# Search in all (local and remote) branches
git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string"

# Search in branches, and tags
git show-ref | grep -v "refs/stash" | cut -d' ' -f2 | xargs git grep "string"

5
কমপক্ষে সমস্ত শাখায় অনুসন্ধানের জন্য এটি হওয়া উচিত: git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string" বা এটি ->ফাইল তালিকার প্রতীক সহ ব্যর্থ হবে , যা স্থানীয় থেকে দূরবর্তী শাখাগুলির সম্পর্ককে বোঝায়
ইলিয়া শিয়ারশফ

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