2013-08-21 6 views
16

शीर्षक कहता है, मैं प्रत्येक प्रतिबद्धता को ढूंढना चाहता हूं जिसके diff में विशिष्ट स्ट्रिंग है।उन सभी कामों को दिखाएं जिनके diff में विशिष्ट स्ट्रिंग

पल में, मैं

git log -p 'filename' 

कौन सा हर diff, जहां मैं स्ट्रिंग के लिए खोज के इंटरफेस की तरह कम से पता चलता का उपयोग करें। फिर मैं वास्तविक प्रतिबद्ध संदेश खोजने के लिए पीछे हटना चाहता हूं।

grep में पाइप गिट लॉग -p को सरल विकल्प हो सकता है, लेकिन मुझे उस तरह की प्रतिबद्ध आईडी या संदेश नहीं मिल रहा है।

+0

क्या आप इसकी समीक्षा करना चाहते हैं जवाब? मेरा मानना ​​है कि अन्य उत्तरों एक स्क्रिप्ट से बेहतर हैं (वास्तव में एक पंक्ति होगी) और एक अधिक विस्तृत स्पष्टीकरण प्रदान करता है –

उत्तर

13

यहाँ एक एक लाइनर खोल स्क्रिप्ट है

git log -p | grep 'filename' 
+0

एक लाइनर के लिए थोड़ा वर्बोज़ (सामान्य परिदृश्य जब मुझे इसका उपयोग करने की आवश्यकता है) आज़माएं। लेकिन यह साफ समाधान है और यह काम करता है। मैं प्रश्न अगले 24 घंटों तक खुला रहने दूंगा, और जब तक कोई बेहतर समाधान न हो, तो अपना स्वीकार करें। मदद के लिए धन्यवाद – bbaja42

1

आप लिनक्स पर हैं, तो पाइप यह egrep के माध्यम से और एक regex

git log -p 'filename' | egrep '(yourstring|commit-message)' 
+0

हाँ, अच्छा डीए, लेकिन मुझे संदर्भ नहीं दिखाई देता है (जो प्रतिबद्धता थी जिसमें परिवर्तन था)। वैसे भी Thnx। – bbaja42

+0

@ bbaja42 egrep के बारे में क्या? गिट लॉग-पी 'फ़ाइल नाम' | egrep '(yourstring | प्रतिबद्ध संदेश)'। इस तरह आउटपुट लाइनों के बाद प्रतिबद्ध संदेश होंगे। मैचों के चारों ओर अधिक संदर्भ प्राप्त करने के लिए, -सी ध्वज को egrep – user1333371

+0

पर भेजा जा सकता है हाँ, जो कि git log -p 'filename' काम कर सकता है। egrep '(yourstring | प्रतिबद्ध संदेश)' | grep-b 1 yourstring। यह केवल संदेश और 'द स्ट्रिंग' को दिखाएगा जो – bbaja42

0

आप एक पाइप और ग्रेप आदेश का उपयोग करने पर विचार किया पर खोज?

उदाहरण:

git log --grep="filename" 

या एक विशिष्ट फ़ाइल पर:

git log --grep="filename" README 
+0

से मेल खाता है, बुरा विचार नहीं है, लेकिन मुझे वास्तव में प्रतिबद्ध संदेश की आवश्यकता है, इसलिए मैं उस प्रतिबद्धता का संदर्भ प्राप्त कर सकता हूं। और चूंकि काम काफी बड़ा हो सकता है, मैं वास्तव में grep – bbaja42

0

उस Git इस के लिए, उदाहरण के लिए उपयोग कर सकते हैं (स्वरूपण उद्देश्यों के लिए एक से अधिक पंक्ति में विभाजित) जो वर्तमान-शाखा-पहुंच योग्य कामों की पुनरावृत्ति को प्रभावित करता है जी path जहां git show -p में pattern दिया गया है। यह सही नहीं है (यह प्रतिबद्ध संदेशों के साथ-साथ diffs से मेल खाएगा) लेकिन यहां से आपको पसंद करना चाहिए, लेकिन इसे यहां से ट्विक करना आसान होना चाहिए।

git rev-list HEAD -- path | 
while read rev; do 
    if git show -p $rev | grep pattern >/dev/null; then 
     echo $rev 
    fi 
done 

ध्यान दें कि आप के साथ git show जगह ले सकता है, उदाहरण के लिए, git diff $rev^ $rev (ध्यान दें कि यह केवल प्रथम माता पिता के खिलाफ तुलना अगर यह एक मर्ज है), या git whatchanged $rev, या जो कुछ भी आप की तरह। मुख्य चाल सभी उम्मीदवारों को निकालने के लिए git rev-list से शुरू करना है (दिए गए पथ को प्रभावित करने वाली प्रतिबद्धता; से शुरू होने वाले सभी कामों को प्राप्त करने के लिए -- path भाग छोड़ दें)। git rev-list के साथ आप अन्य कई चीजों के लिए git-rev-list(1) देखें।

+0

--grep की सी विकल्प का उपयोग नहीं कर सकता, केवल वास्तविक संदेशों के लिए, प्रतिबद्ध संदेशों के लिए खोज करता हूं। गिट हेल्प लॉग – bbaja42

+0

के आधार पर, ठीक है, इस गिट grep 'filename' $ (गिट rev-list --all) –

20
git log -S'string' 

स्ट्रिंग जोड़ने या निकालने के लिए उपयोग करने के लिए उपयोग किया जा सकता है। यह बिल्कुल वही व्यवहार नहीं करता है, क्योंकि यह केवल उन चीजों से मेल खाता है जो वास्तव में पैटर्न के उदाहरण को जोड़ते या हटाते हैं, और नहीं (उदाहरण के लिए) यह अलग-अलग संदर्भ में होता है। लेकिन शायद यह आपके लिए काफी अच्छा है।

+0

हाँ, मैंने कोशिश की, लेकिन जैसा कि आपने बताया है, मेरे मामले में यह मुझे जो कुछ भी चाहिए उसे दिखाता नहीं है। वैसे भी, अच्छा प्रयास करें। – bbaja42

+0

'गिट लॉग-पी-एस'स्ट्रिंग' – nroose

7

मुझे पता है कि इस प्रश्न का उत्तर थोड़ी देर के लिए दिया गया है, लेकिन मैं इस पर भी आया और मुझे एक अलग समाधान मिला, इसलिए मैंने सोचा कि मैं साझा करूंगा। Git-log का -G स्विच जो आप कर रहे हैं उसे करना चाहिए, जहां -S स्विच केवल आउटपुट ही होगा जहां मिलान की गई स्ट्रिंग के अवसरों की संख्या बदलती है।

git-log के आदमी पृष्ठ से

: मतभेद जिसका पैच पाठ शामिल जोड़ा गया/निकाला लाइनों से मेल खाने वाले के लिए

जी देखो।

एस --pickaxe-regex और जी के बीच का अंतर समझने के लिए, एक ही फ़ाइल में निम्न अंतर के साथ एक प्रतिबद्ध पर विचार करें:

+ return !regexec(regexp, two->ptr, 1, &regmatch, 0); 
... 
- hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0); 

जबकि Git लॉग जी "regexec (regexp" होगा इस प्रतिबद्धता को दिखाएं, गिट लॉग-एस "रेगेक्सैक (रेगेक्सपी" - पिक्सेक्स-रेगेक्स नहीं होगा (क्योंकि उस स्ट्रिंग की घटनाओं की संख्या में बदलाव नहीं आया है)

अधिक जानकारी के लिए gitdiffcore (7) में पिकैक्स प्रविष्टि देखें

+0

हुरेय! धन्यवाद! यह मेरे लिए पूरी तरह से काम करता है। –

+0

ध्यान दें, इस अंतर्निहित '-G' (परिवर्तन के लिए grep) और मेरे लंबे "एक-लाइनर" उत्तर के बीच का अंतर यह है कि यह इस विशेष' regexec' घटना को मिलेगा, लेकिन * नहीं * एक यह सिर्फ कुछ 'गिट लॉग-पी' आउटपुट के लिए दिखाए गए संदर्भ में है। उदाहरण के लिए यदि लाइन बदल दी गई थी, तो 'रेगेक्सैक' कॉल से पहले * लाइन * थी, 'गिट लॉग-जी' उस बदलाव को नहीं मिलेगी, लेकिन प्रत्येक 'गिट शो-पी' कमांड का आउटपुट खोजेगा। (इसलिए, जो आदेश आप कोशिश करना चाहते हैं उस पर निर्भर करता है।) – torek

संबंधित मुद्दे