एक निश्चित शब्द के लिए Grep Git प्रतिबद्ध अंतर या सामग्री कैसे करें?


622

Git कोड रिपॉजिटरी में मैं उन सभी कमिट्स को सूचीबद्ध करना चाहता हूं जिनमें एक निश्चित शब्द होता है। मैंने यह कोशिश की

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>विचार एक ही फ़ाइल में निम्न diff के साथ प्रतिबद्ध:

+    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नहीं करेगा (क्योंकि उस तार की घटनाओं की संख्या में बदलाव नहीं हुआ था)।


Git 2.25.1 (फरवरी 2020) के साथ, प्रलेखन उन regexes के आसपास स्पष्ट किया गया है।

मार्टिन (gren (``) द्वारा प्रतिबद्ध 9299f84 (06 फ़रवरी 2020) देखें । ( जूनियो सी हमानो द्वारा विलय - - में 0d11410 , 12 फरवरी 2020)
gitster

diff-options.txt: उदाहरण में "रेगेक्स" अधिभार से बचें

रिपोर्ट-बाय: एडम डिनवुड
साइन-ऑफ-बाय: मार्टिन Reviewedgren समीक्षित-द्वारा: टेलर ब्लाउ

जब हम -Gऔर -S(का उपयोग करते हुए --pickaxe-regex) के बीच के अंतर को उदाहरण देते हैं, तो हम ऐसा करते हैं एक उदाहरण का उपयोग करते हुए और git diff"regexec", "regexp", "regmatch" को शामिल करते हुए, ...

उदाहरण सही है, लेकिन हम "regex। *" लिखने से बचना आसान बना सकते हैं जब तक कि वास्तव में हमारी बात बनाने की आवश्यकता न हो।

इसके बजाय कुछ बने-बनाए, गैर-रीजेंसी शब्दों का उपयोग करें।

git diffप्रलेखन अब में शामिल हैं:

के बीच अंतर उदाहरण देकर स्पष्ट करने -S<regex> --pickaxe-regexऔर -G<regex>विचार एक ही फ़ाइल में निम्न diff के साथ प्रतिबद्ध:

+    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
@TankorSmash उन अंतरों को -S<string>देखें जो <string> का उदाहरण प्रस्तुत करते हैं या निकालते हैं। -G<string>उन अंतरों के लिए देखें जिनकी जोड़ी गई या हटाई गई रेखा दिए गए <regex> से मेल खाती है।
एम-रिक

1
@ m-ric ओह मैं देख रहा हूँ, एक एकल स्ट्रिंग उदाहरण, बनाम एक पूरी लाइन! धन्यवाद
TankorSmash

3
@ m-ric, @TankorSmash: अंतर यह है कि -S<string>तेज है क्योंकि यह केवल जाँचता है कि क्या <string>परिवर्तन की घटनाओं की संख्या है , जबकि -G<string>खोजों को जोड़ा गया है और हर प्रतिबद्ध अंतर में लाइन को हटा दिया गया है।
याकूब नारबस्की

3
यदि आपको बीच में जगह के साथ शब्दों को खोजने की आवश्यकता है, तो git log --grep="my words"
एमईएम

4
@ एमईएम, --grepसे अलग -Sऔर है -G। आप इन तर्कों में से प्रत्येक को स्ट्रिंग उद्धृत कर सकते हैं।
एक्यूमेनस

255

git logके पिकेटे के साथ "शब्द" सहित परिवर्तनों के साथ कमिट मिलेंगे git log -Sword


60
यह पूरी तरह से सटीक नहीं है। -S <string> उन अंतरों को देखें जो <string> का उदाहरण प्रस्तुत करते हैं या निकालते हैं। ध्यान दें कि यह अलग आउटपुट में दिखाई देने वाली स्ट्रिंग से अलग है;
tttam

4
हालांकि यह आम तौर पर सही उत्तर है, मैंने केवल दूसरों को इस उत्तर ( stackoverflow.com/a/1340245/586983 ) को पढ़ने के लिए प्रोत्साहित करने के लिए डाउनवोट किया, जिसमें 3 अलग-अलग तरीके हैं और उनकी सूक्ष्मता बताते हैं।
जेकॉन्रिल्स

18
भगवान! मुझे नहीं लगता कि यह एक सही जवाब को कम करने का एक अच्छा कारण है ... आप आश्वस्त नहीं थे कि टिप्पणी में लिंक सहित पर्याप्त प्रोत्साहन होगा?
देबोरा

@jakeonrails, यह उत्तर इस (पुराने) के लिए एक संपादित होना चाहिए था, इसलिए हमारे पास इन कष्टप्रद डुप्लिकेट नहीं हैं। लेकिन लोग केवल स्वच्छ उत्तर पृष्ठ के बजाय प्रतिष्ठा चाहते हैं।
इयूलियन ओनोफ्रेई

22

बहुत सारे प्रयोग के बाद, मैं निम्नलिखित की सिफारिश कर सकता हूं, जो कि दिए गए rexxp युक्त रेखाओं को लागू करने या हटाने वाले शो को दिखाता है, और प्रत्येक में पाठ परिवर्तनों को प्रदर्शित करता है, जिसमें रंग जोड़े गए और हटाए गए शब्दों को दिखाते हैं।

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>
fangxing

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ऐसा करने के लिए उपयोग करें । अधिक जानकारी के लिए आप vim-fugitive को स्थापित कर सकते हैं और इसके द्वारा turorial देख सकते हैं :help Grep। और यह प्रकरण: इतिहास-ए-गित-भंडार का अन्वेषण आपको वह सब करने के लिए मार्गदर्शन करेगा।


1

नियमित अभिव्यक्ति पर बूलियन कनेक्टर का उपयोग करने के लिए:

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

यह नियमित अभिव्यक्ति के लिए नियमित अभिव्यक्ति [0-9] * या [az] * प्रतिबद्ध संदेशों पर खोज करता है।


-1

यदि आप अपने गिट इतिहास से हटाने के लिए संवेदनशील डेटा की खोज करना चाहते हैं (यही कारण है कि मैं यहां उतरा हूं), तो इसके लिए उपकरण हैं। उस मुद्दे के लिए एक समर्पित सहायता पृष्ठ के रूप में गितुब ।

यहाँ लेख का सार है:

बीएफजी रेपो-क्लीनर एक तेज़, सरलतम अवांछित डेटा को हटाने के लिए Git फिल्टर शाखा करने के लिए वैकल्पिक है। उदाहरण के लिए, संवेदनशील डेटा के साथ आपकी फ़ाइल को निकालने और अपनी नवीनतम प्रतिबद्ध को अछूता छोड़ने के लिए), चलाएँ:

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

पासवर्ड में सूचीबद्ध सभी पाठ को बदलने के लिए। जहाँ भी यह आपके रिपॉजिटरी के इतिहास में पाया जा सकता है, चलाएं:

bfg --replace-text passwords.txt

पूर्ण उपयोग के लिए BFG रेपो-क्लीनर के दस्तावेज देखें और निर्देश डाउनलोड करें।


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