Git का उपयोग करके, मैं सभी शाखाओं में एक स्ट्रिंग की खोज कैसे कर सकता हूं?


170

Git का उपयोग करके, मैं दी गई स्ट्रिंग के लिए सभी स्थानीय शाखाओं में सभी फ़ाइलों के भीतर कैसे खोज सकता हूं?

GitHub विशिष्ट: क्या सभी GitHub शाखाओं में उपरोक्त खोज करना संभव है? (मेरी दूरस्थ GitHub रिपॉजिटरी पर कई दूरस्थ शाखाएँ हैं जिन्हें आदर्श रूप से मुझे इस खोज के लिए नहीं लाना होगा ...)


1
git-grep वह हो सकता है जिसे आप ढूंढ रहे हैं, लेकिन मुझे अभी तक यकीन नहीं है कि आपको किन विकल्पों की आवश्यकता होगी ...
johnny

जवाबों:


170

आप इसे Git रिपॉजिटरी में कर सकते हैं:

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

GitHub उन्नत खोज में कोड खोज क्षमता होती है:

कोड खोज GitHub पर सार्वजनिक रूप से होस्ट किए गए सभी कोड के माध्यम से दिखेगा। आप इसके द्वारा फ़िल्टर भी कर सकते हैं:

  • भाषा: language:
  • रिपॉजिटरी नाम (उपयोगकर्ता नाम सहित): repo:
  • फ़ाइल पथ: path:

यह मुझे एक विभाजन दोष का कारण बनता है। हालाँकि कछुआ हो सकता है (विंडोज़), हालाँकि।
बीन 5

6
यह वास्तव में ऐसा करने का सबसे अच्छा तरीका नहीं है। यह git refs की मात्रा को नियंत्रित नहीं करता है जो इसे पारित किया गया है git grep ...। अन्य उत्तरों को देखें, वे स्वीकृत उत्तर के रूप में चिह्नित होने के बावजूद भी इससे बेहतर हैं!
स्लम

1
यह बहुत अच्छा होगा यदि आप अपने फ़िल्टर के लिए एक उदाहरण जोड़ सकते हैं, उदाहरण के लिए path:, क्योंकि एक नज़र में दस्तावेज़ीकरण स्पष्ट नहीं दिखता है कि इस फ़िल्टर को कहां लागू करना है, अपने क्वेरी उदाहरण में उद्धरण से पहले इसे मान लें?
प्रातः

3
मैं केवल शाखा का नाम कैसे सूचीबद्ध कर सकता हूं। वर्तमान में, यह सभी हैश में स्ट्रिंग को सूचीबद्ध करता है।
हार्रिफ़ेंग

4
गितुब खोज केवल मास्टर शाखा पर है । से help.github.com/articles/searching-code : "केवल डिफ़ॉल्ट शाखा कोड खोज लिए सूचीबद्ध किया गया ज्यादातर मामलों में, इस मास्टर शाखा हो जाएगा।।"
RedPanda

124

यदि आप gmanp git कमांड का उपयोग करते हैं और एक त्रुटि प्राप्त करते हैं:

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

तो आपको xargs का उपयोग करना चाहिए :

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

यह भी देखें कि कैसे grep (खोज) Git के इतिहास में कोड प्रतिबद्ध है


इसके अलावा, यह फिशशेल जैसे अन्य प्रकार के कंसोल के साथ अधिक संगत लगता है
डैनियल

1
धन्यवाद!!! ZSH का उपयोग करना और यह काम किया, जबकि @manojlds कमांड ने आपके द्वारा बताई गई त्रुटि दी! लेकिन चेतावनी, यह एक लंबे रेपो के लिए एक लंबे इतिहास के साथ बहुत लंबा समय ले सकता है।
लैकोस्टेनकोडर

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 ...
स्टीव

यहाँ वह फ़ंक्शन है जो मैंने अपने bashrc में जोड़ा है। आशा है कि यह किसी की मदद करता है:function gsearch { git grep $1 $(git show-ref --heads) | grep "refs/heads" | grep $1 } # last grep to keep grep color highlight
AFP_555

यह स्वीकृत उत्तर होना चाहिए। सभी शाखाओं में एक स्ट्रिंग पकड़ना लेकिन नवीनतम सामग्री के लिए केवल एक बहुत ही सामान्य उपयोग का मामला है।
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" या यह ->फाइलों की सूची में प्रतीक के साथ विफल हो जाएगा , जो स्थानीय से दूरस्थ शाखाओं के संबंध को दर्शाता है
इल्या शेरेशॉफ़

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.