2012-09-17 14 views
37

क्या किसी दिए गए पैटर्न द्वारा फ़िल्टर किए गए गिट-डिफ को दिखाने का कोई तरीका है। मैं awkगिट diff grep कैसे करें?

git diff | awk "/\+\+\+/{f = \$2}; /PATTERN/ {print f \$0} " 

का उपयोग कर एक समाधान के साथ आया था

तरह
git grepdiff pattern 

changed file 
+++ some sentence with pattern 
changed file 2 
--- some other pattern 

दुर्भाग्य से सरल समाधान काफी अच्छा

git diff | grep pattern 

+++ some sentence with pattern 
--- some other pattern 
# not an option as doesn't put the filename close to the match 

नहीं है लेकिन वह पता लगाने के लिए प्यार होता है वहाँ इसके लिए एक आदेश है।

+2

स्पष्ट रूप से git-diff-grep नामक github प्रोजेक्ट कुछ अलग करता है। – Kuba

उत्तर

55

यकीन नहीं है लेकिन git diff -G <regex> ध्वज ठीक नहीं है?

जी < regex>

Look for differences whose added or removed line matches the given <regex>. 
+5

जो मैं बिल्कुल ढूंढ रहा हूं, क्योंकि मैं केवल लाइनों को देखना चाहता हूं, जो पैटर्न से मेल खाते हैं - फाइलों का पूरा अंतर नहीं, जिसमें – Kuba

+0

पैटर्न के साथ परिवर्तन शामिल है, तो मुझे लगता है कि आपके – CharlesB

+0

के साथ कोई आसान समाधान नहीं है कम से कम गिट diff -G पूर्ण गिट diff से बेहतर पहला कदम है। – Kuba

3

मैं git log -p है, जो कम (विन्यास, हालांकि) को खोलता है, जो बारी में साथ / लिए खोजा जा सकता का उपयोग करें। git log -S <searchword> भी है।

+0

मैं उन लोगों से परिचित हूं - मैं इतिहास में नहीं देख रहा हूं, लेकिन वर्तमान कार्य परिवर्तनों में। – Kuba

+0

ठीक है, फिर वही विधि (जैसा कि रोबस्ट उद्धृत किया गया है) का उपयोग किया जा सकता है। यदि आप आउटपुट चाहते हैं, तो आप शायद libgit2 या gitgui/gitk का उपयोग करके किसी भी लाइब्रेरी का उपयोग कर सकते हैं। – chelmertz

7

क्या आपने git diff -S<string> या git diff -G".*string.*" को आजमाया है? ध्यान दें कि वे समकक्ष नहीं हैं, 0 -देखें-एस क्या करता है।

9

एक और संभावना पूरे diff को देखने और सामान्य less आदेशों का उपयोग करके आउटपुट की खोज होगी (/ टाइप करें और फिर पैटर्न)।

जब आपके पास less--jump-target=N का उपयोग कर मैच से पहले कुछ पंक्तियां दिखाने के लिए कॉन्फ़िगर किया गया है, तो यह बहुत उपयोगी है। इस तरह यह प्रयास करें:

PAGER="/usr/bin/less --jump-target=10" git diff 

इसका मतलब है कि मैच लाइन 10 पर दिखाया जाना चाहिए (शो उपरोक्त संदर्भ के 9 लाइनों), भी फ़ाइल नाम को देखने के लिए पर्याप्त हो सकता है।

आप भी उदाहरण का उपयोग कर सकते हैं --jump-target=.5 इसे स्क्रीन के बीच में मैच को स्थान बनाने के लिए।

0

यहाँ एक कस्टम diff उपकरण परिवर्तन के अंदर grepping की अनुमति देता है कि (लेकिन संदर्भ) है:

प्रयोग

GIT_EXTERNAL_DIFF="mydiff --grep foo" git diff

हो जाएगा ताकि उत्पादन अपने परिवर्तनों कि foo शामिल में उन पंक्तियों (लाइनों सहित foo आपके परिवर्तनों के कारण गायब हो गए)। foo के बजाय किसी भी grep पैटर्न का उपयोग किया जा सकता है।

प्रत्येक उत्पादन लाइन निम्नलिखित उपसर्ग के साथ शुरू होता है:

filename: oldlinenum: newlinenum| 

स्क्रिप्ट भी जिस स्थिति में यह बस स्वरूप पूर्ण diff (अर्थात पूरे संदर्भ उपलब्ध कराने के) जैसा कि ऊपर वर्णित --grep विकल्प के बिना इस्तेमाल किया जा सकता।

mydiff

#!/bin/bash 

my_diff() 
{ 
    diff --old-line-format="$1"':%6dn:  |-%L'  \ 
     --new-line-format="$1"':  :%6dn|+%L'  \ 
     --unchanged-line-format="$1"':%6dn:%6dn| %L' \ 
     $2 $3 
} 

if [[ $1 == '--grep' ]] 
then 
    pattern="$2" 
    shift 2 
    my_diff "$1" "$2" "$5"|grep --color=never '^[^|]\+|[-+].\+'"$pattern"'.*' 
else 
    my_diff "$1" "$2" "$5" 
fi 

exit 0 
0

Windows पर, एक सरल उपाय है:

git diff -U0 | findstr string 

आप फ़ाइल नाम से समूहीकरण चाहते हैं, इस

FOR /F "usebackq delims==" %i IN (`git diff --name-only`) do git diff -U0 %~fi | findstr string 
0

का उपयोग इस के लिए काम किया है मैं, मुझे उम्मीद है कि यह किसी की मदद करेगा:

git diff | grep -P '^\+|^\-' 
संबंधित मुद्दे