2012-04-18 13 views
91

तो अगर मैं एक फ़ाइल foo.rb और यह मेरे एक लापता विधि बार कहा जाता है के लिए एक त्रुटि दे रहा है कहा जाता है, तो मैं foo के इतिहास खोज करना चाहते हैं स्ट्रिंग bar स्ट्रिंग के लिए .rb यह देखने के लिए कि क्या इसे पहले कभी परिभाषित किया गया था।Git खोज

मैं इस Search all of Git history for a string?

पाया लेकिन यह सब फाइलों खोज करता है। मैं बस एक फाइल में खोजना चाहता हूँ।

+4

बस एक एफवाईआई के रूप में, यदि आप इसे एक फ़ाइल में सीमित करना चाहते हैं तो आप गिट कमांड के समूह में '- फ़ाइल नाम' जोड़ सकते हैं। –

उत्तर

134

इस उद्देश्य आप -S विकल्प का उपयोग कर सकते लॉग git करने के लिए:

git log -S'bar' -- foo.rb 
+20

या 'गिट लॉग -G'bar' - foo.rb' उस अंतर की खोज करने के लिए जिसमें 'बार' शामिल है, जो कि 'बार' के अवसरों की संख्या बदलता है (गिट-लॉग मैनपेज देखें)। –

+0

यह उद्धरण के साथ मेरे लिए काम नहीं करता है, मुझे _bar_ खोजने के लिए '-Sbar' का उपयोग करना पड़ा। शायद विंडोज कमांड लाइन का उपयोग कर मेरे साथ कुछ करना है। – zbr

+0

दूसरे शब्दों में, '-G' एक रेगेक्स खोज के लिए है ... यह भी एक महान संदर्भ है: https://stackoverflow.com/a/4472267/2586761 – ptim

1

वहाँ Git लॉग आदेश के लिए एक ओवरराइड (manual से) है:

$ git log Makefile  # commits that modify Makefile 

तो तुम इस्तेमाल कर सकते हैं:

git log foo.rb | grep "bar" 
+2

धन्यवाद, लेकिन यह सिर्फ फाइल के स्रोत का इतिहास नहीं, प्रतिबद्ध इतिहास की खोज करता है। –

+2

वास्तव में एक और ओवरराइड है जो स्ट्रिंग डेटा परिवर्तन की खोज करता है: गिट लॉग-एस'फू() '# जो स्ट्रिंग' foo() ' –

+1

से मेल खाने वाले किसी भी फ़ाइल डेटा को जोड़ या निकालता है, आप --full-diff पैरामीटर का उपयोग करने का भी प्रयास कर सकते हैं । लॉग न केवल इतिहास का इतिहास दिखाते हैं, बल्कि भिन्नता भी दिखाते हैं। –

10

या शायद आप इसे आजमा सकते हैं (संबंधित प्रश्नों से Search all of git history for string)

git rev-list --all foo.rb | (
    while read revision; do 
     git grep -F 'bar' $revision foo.rb 
    done 
) 

यह वास्तव में फ़ाइल की सामग्री को खोजा जाएगा और बार के किसी भी घटना के लिए संदेश/पैच प्रतिबद्ध नहीं।