एक फ़ाइल के इतिहास में स्ट्रिंग की खोज करें


172

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

मैंने एक स्ट्रिंग के लिए इस खोज को Git इतिहास पाया है ?

लेकिन यह सभी फाइलों को खोजता है। मैं सिर्फ एक फाइल में खोजना चाहता हूं।


6
एक FYI के रूप में, -- filenameयदि आप इसे एक फ़ाइल में सीमित करना चाहते हैं, तो आप git कमांड के एक समूह में संलग्न कर सकते हैं ।
कार्ल बेवेलफेल्ट

जवाबों:


234

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

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

39
या git log -G'bar' -- foo.rbयह खोजने के लिए कि 'बार' के बजाय 'बार' शामिल है, जो 'बार' की घटनाओं को बदल देता है (गिट-लॉग मैनपेज देखें)।
जकुब नारबस्की

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

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

17

या हो सकता है कि आप इसे आज़मा सकते हैं (संबंधित प्रश्नों से स्ट्रिंग के लिए सभी इतिहास खोजें )

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

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


खिड़कियों के लिए: for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rb(डबल-उद्धरण के लिए देखें यदि फ़ाइलनाम या खोज वाक्यांश में रिक्त स्थान हैं)
बिस्किट 314

1
मेरे लिए विंडोज में यह "डू" के बिना काम नहीं करता था: for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb (डबल-कोट्स देखें अगर फ़ाइलनाम या खोज वाक्यांश में रिक्त स्थान हैं)
xberger

2

गिट लॉग कमांड ( मैनुअल से ) के लिए एक ओवरराइड है :

$ git log Makefile      # commits that modify Makefile

तो आप उपयोग कर सकते हैं:

git log foo.rb | grep "bar"

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

2
वास्तव में एक और ओवरराइड है जो स्ट्रिंग डेटा परिवर्तन की खोज करता है: git log -S'foo () '# कमिट करता है जो स्ट्रिंग' फू () 'से मेल खाते हुए किसी भी फ़ाइल डेटा को जोड़ता या हटाता है
दिमित्री रेज़निक

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

@DmitriyReznik - जाहिरा तौर पर --full-diff काम नहीं करता (जैसा कि कोई अंतर नहीं दिखाया गया है) बिना -p, कम से कम git पर 1.7.9.5
sdaau

0

मैंने उपयोग किया git log -S "string" --follow -p "path of file"जो उस स्ट्रिंग के साथ सभी परिवर्तनों का पूरा इतिहास दिखाता है।

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