গিট প্রকল্পের সমস্ত শাখায় 'গ্রেপ অনুসন্ধান' করা সম্ভব?


138

git grepগিট নিয়ন্ত্রণ উত্সাহিত প্রকল্পের সমস্ত শাখার অভ্যন্তরে চালানো কি সম্ভব ? নাকি চালানোর জন্য আরও একটি আদেশ আছে?



উত্তর:


188

" গিট ইতিহাসে প্রতিশ্রুতিবদ্ধ কোডটি গ্রেপ (অনুসন্ধান) কীভাবে করবেন " প্রশ্নটি সুপারিশ করে:

 git grep <regexp> $(git rev-list --all)

এটি সমস্ত কমিটগুলির মাধ্যমে অনুসন্ধান করে, যাতে সমস্ত শাখা অন্তর্ভুক্ত করা উচিত।

অন্য ফর্মটি হ'ল:

git rev-list --all | (
    while read revision; do
        git grep -F 'yourWord' $revision
    done
)

আপনি এই নিবন্ধে আরও উদাহরণ খুঁজে পেতে পারেন :

আমি উপরের মতো একটি প্রকল্পে যথেষ্ট চেষ্টা করেছি যে গিটটি আর্গুমেন্টের আকার সম্পর্কে অভিযোগ করেছে, তাই আপনি যদি এই সমস্যাটিতে চলে যান তবে কিছু করুন:

git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)

(নীচে এই উত্তরের শেষ বিভাগে একটি বিকল্প দেখুন)

আপনি যদি সেগুলি চান তবে সেগুলিটি ভুলে যাবেন না:

# Allow Extended Regular Expressions
git config --global grep.extendRegexp true
# Always Include Line Numbers
git config --global grep.lineNumber true

এই উপনামটিও সহায়তা করতে পারে:

git config --global alias.g "grep --break --heading --line-number"

দ্রষ্টব্য: চেরঞ্জি পরামর্শ দিয়েছে এটি git rev-list --allএকটি ওভারকিল।

আরও পরিশোধিত কমান্ড হতে পারে:

git branch -a | tr -d \* | xargs git grep <regexp>

যা আপনাকে কেবল শাখা (দূরবর্তী শাখা সহ) অনুসন্ধান করার অনুমতি দেবে

এমনকি আপনি এটির জন্য একটি বাশ / জেডশিয়ার উপন্যাস তৈরি করতে পারেন:

alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>

আগস্ট 2016 আপডেট করুন: আরএম মন্তব্যগুলিতে সুপারিশ করে

সংস্করণ fatal: bad flag '->' used after filenameচেষ্টা করার সময় আমি একটি " " পেয়েছিলাম git branch। ত্রুটিটি একটি HEADএলিয়াসিং স্বরলিপিটির সাথে সম্পর্কিত ছিল ।

আমি পাইপগুলিতে এবং কমান্ডগুলির sed '/->/d'মধ্যে একটি যোগ করে এটি সমাধান করেছি ।trxargs

 git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>

এটাই:

alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep"
grep_all <regexp>

git branchটিআর বা সেডের আউটপুটটি পাইপ করা ভাল ধারণা নয় ; git branchমানুষের ব্যবহারের জন্য বোঝানো একটি চীনামাটির বাসন কমান্ড। পছন্দসই বিকল্পগুলির জন্য স্ট্যাকওভারফ্লো . com/a/3847586/2562319 দেখুন ।
jbyler

@ জাইবিলার ভাল পয়েন্ট হাস্যকরভাবে, আমি উত্তরটির আগে উত্তর চীনামাটির ঘরে পোস্ট করেছি: stackoverflow.com/a/6978402/6309 । এবং আমি এটি স্ট্যাকওভারফ্লো . com/a/19206916/6309 এ উদাহরণস্বরূপ ব্যবহার করি ।
ভনসি

হ্যাঁ, সুন্দর অন্যান্য উত্তর মাধ্যমে দেখার জন্যে, আমি মনে করি @errordeveloper দ্বারা উত্তর পরিষ্কার: stackoverflow.com/a/21284342/2562319 : "Git, grep <regexp> $ (Git জন্য-প্রতিটি-সুত্র --format = '% (refname) 'refs /) "
jbyler

1
শাখার নামটি অনুসন্ধানের সাথে মিলে যাওয়ার কোনও উপায় আছে কি?
ফ্রাঙ্কস্যান্ড

63

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

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

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

একটি প্রাসঙ্গিক প্রতিশ্রুতি পাওয়া গেছে যা আপনি যে পাঠ্যটি সন্ধান করছেন তা যুক্ত করে (উদাঃ 8beeff00d), সেই শাখাগুলি আবিষ্কার করুন যা প্রতিশ্রুতিবদ্ধ রয়েছে:

git branch -a --contains 8beeff00d

22

আমি এটি সবচেয়ে দরকারী বলে মনে করেছি:

git grep -i foo `git for-each-ref --format='%(refname)' refs/`

আপনি কেবল দূরবর্তী বনাম স্থানীয় শাখাগুলি দেখতে চান কিনা তার উপর নির্ভর করে আপনাকে শেষ যুক্তিগুলি সমন্বয় করতে হবে, যেমন:

  • git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
  • git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)

আমি যে উপন্যাসটি তৈরি করেছি তা দেখতে এইরকম দেখাচ্ছে:

grep-refs = !sh -c 'git grep "$0" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)'

1
আকর্ষণীয় ওরফে। +1 টি। আমার উত্তরের চেয়ে আরও সুনির্দিষ্ট
ভনসি

বাক্য অনুসন্ধানের জন্য কীভাবে আপনার উপনাম তৈরি করবেন? যখন আমি "foo বার" প্যারামিটার হিসাবে পাস করি, তখন আমি পাই: মারাত্মক: দ্বিধাহীন যুক্তি 'বার': অজানা সংশোধন বা পথ কার্যকর গাছের মধ্যে নেই। সংশোধন থেকে পাথ পৃথক করতে '-' ব্যবহার করুন
জটকি

স্থানটি পালানোর চেষ্টা করুন: "ফু-বার"
গ্যারি গোমেজ 22

এটি পরিষ্কারভাবে গ্রহণযোগ্য উত্তর হবে;) আমি কেবলমাত্র আমার প্রকল্পের সর্বশেষ শাখাগুলি অনুসন্ধান করার জন্য এটিতে প্রসারিত করেছি (500 এরও বেশি পেয়েছেন, জিজ্ঞাসা করবেন না এবং প্রতিটি গ্রেপ 4 সেকেন্ডের জন্য লাগে যাতে আমি চাই না বা প্রয়োজন হয় না) এর চেয়ে বেশি অনুসন্ধান করতে, বলুন, এর মধ্যে 100 টি নতুন)। এর জন্য আমি git for-each-refসাথে আপডেট করেছি --sort=-committerdate --count=100! মূল ধারণা জন্য ধন্যবাদ!
ভেসার

6

এটি দুটি সাধারণ উপায়ে করা সম্ভব: বাশ বা গিট এলিয়াস

এখানে তিনটি আদেশ রয়েছে:

  1. git grep-branch - স্থানীয় এবং দূরবর্তী সমস্ত শাখায় অনুসন্ধান করুন
  2. git grep-branch-local - শুধুমাত্র স্থানীয় শাখায় অনুসন্ধান করুন
  3. git grep-branch-remote - কেবল দূরবর্তী শাখা

ব্যবহার একই হিসাবে git grep

git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"

জিআরইপি ব্যবহার করে: গিট এলিয়াস

ফাইল ~ / .gitconfig

কমান্ডগুলি ~/.gitconfigফাইল করার জন্য ম্যানুয়ালি যুক্ত করা উচিত , কারণ git config --global aliasআপনি যে জটিল কোডটি যুক্ত করেন তা মূল্যায়ন করে এলোমেলো করে ফেলুন।


[alias]
    grep-branch        = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | xargs git grep $@; };f "
    grep-branch-remote = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | grep '^remotes' | xargs git grep $@; };f"
    grep-branch-local  = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' -e '^remotes' | xargs git grep $@;  };f "

দ্রষ্টব্য: আপনি যখন এলিয়াস যুক্ত করেন এবং সেগুলি চালাতে ব্যর্থ হয় - ব্যাকস্ল্যাশগুলি পরীক্ষা করুন \\\ করুন তাদের বাশ কমান্ডের তুলনায় অতিরিক্ত পালানোর প্রয়োজন হতে পারে ।

  • git branch -a - সমস্ত শাখা প্রদর্শন;
  • sed -e 's/[ \\*]*//' - ছাঁটাই স্পেস ফাঁকা (থেকেbranch -a ) এবং * (সক্রিয় শাখার নাম এটি রয়েছে);
  • grep -v -e '\\->' - জটিল নামগুলি উপেক্ষা করুনremotes/origin/HEAD -> origin/master ;
  • grep '^remotes' - সমস্ত প্রত্যন্ত শাখা পান;
  • grep -v -e '^remotes'- বাদে শাখা পান প্রত্যন্ত শাখা ;

উদাহরণ git grep-branch-local -n getTastyCookies

-n মিলের লাইনে লাইন নম্বরটিকে উপসর্গ করুন।

[user@pc project]$ git grep-branch-local -n getTastyCookies

dev:53:modules/factory/getters.php:function getTastyCookies($user);
master:50:modules/factory/getters.php:function getTastyCookies($user)

বর্তমান কাঠামোটি হ'ল:

: - বিভাজক

  1. শাখা: dev
  2. লাইন সংখ্যা: 53
  3. ফাইল পাথ: modules/factory/getters.php
  4. ম্যাচ লাইন: function getTastyCookies($user)

GREP ব্যবহার করে: বেস

আপনার যেমনটি জানা উচিত: বাশ কমান্ডগুলি সংরক্ষণ করা উচিত .sh স্ক্রিপ্টগুলিতে বা একটি শেল চালানো ।

শুধুমাত্র স্থানীয় শাখা

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' -e '^remotes' | xargs git grep "TEXT"

কেবল দূরবর্তী শাখা

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | grep '^remotes' | xargs git grep "TEXT"

স্থানীয় এবং দূরবর্তী শাখা

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | xargs git grep "TEXT"

দুর্দান্ত git grep-branch "find my text"fatal: ambiguous argument 'client': both revision and filename
লাগছে

সবসময় কেন ব্যবহার করবেন -a, যা সমস্ত শাখা দেখায়? আমি git branchকমান্ডের বিকল্পগুলি বন্ধনী পৃথক করতে ব্যবহার করার পরামর্শ দেব । স্থানীয় শাখাগুলি দেখার সময়, কেবলমাত্র একটি একক রয়েছে *, সুতরাং সেডের জন্য এড়াতে হবে না। সুতরাং: git branch | sed -e 's/*/ /' | xargs git grep "TEXT"শুধুমাত্র স্থানীয় শাখার git branch -r | grep -v -- "->" | xargs git grep "TEXT"জন্য , কেবল প্রত্যন্ত শাখার git branch -a | grep -v -- "->" | xargs git grep "TEXT"জন্য , এবং সমস্ত শাখার জন্য
alan


4

আপনি যদি কোনও প্রতিশ্রুতি দেন তবে SHA-1 হ্যাশটির মান git grep ওয়ার্কিং কপির পরিবর্তে এটিতে অনুসন্ধান করুন।

সমস্ত শাখা অনুসন্ধান করতে, আপনি এর সাথে সমস্ত গাছ পেতে পারেন git rev-list --all। সব দিয়ে রাখুন

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

... এবং ধৈর্য রাখুন

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