कैसे अंतर अलग करने के लिए?


81

क्या किसी दिए गए पैटर्न द्वारा गिट-डिफ फिल्टर को दिखाने का एक तरीका है।

कुछ इस तरह

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

मैं awk का उपयोग करके वर्कअराउंड के साथ आया था

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

लेकिन यह पता लगाना पसंद करेंगे कि इसके लिए एक कमांड है।


3
जाहिरा तौर पर gitub-grep नाम का गिटब प्रोजेक्ट पूरी तरह से कुछ अलग करता है।
क्यूबा

जवाबों:


99

यकीन नहीं है, लेकिन git diff -G <regex>झंडा ठीक नहीं है ?

-जी <regex>

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

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

तब मुझे लगता है कि तुम्हारा कोई सरल उपाय नहीं है
चार्ल्सब

कम से कम git diff -G पूर्ण git अंतर की तुलना में एक बेहतर पहला कदम है।
क्यूबा

1
मेरे संस्करण में -G ध्वज नहीं है। क्या इसे हटाया गया था?
RedX

3
यह भी देखने के लिए उपयोगी है कि कौन सी फाइलें रेगेक्स से प्रभावित थीं:git diff -G <regex> --raw
रमन


11

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

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

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

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

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


3

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


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

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

1

इसने मेरे लिए काम किया, मुझे आशा है कि यह किसी की मदद करेगा:

git diff | grep  -P '^\+|^\-'

1

मुझे लगता है कि "grep" diffआउटपुट के लिए आपका दृष्टिकोण सबसे अच्छा समाधान है।

आप sed का उपयोग करके अपनी awk स्क्रिप्ट में सुधार कर सकते हैं:

colored="(^[\[[0-9;]*[a-zA-Z])"
marker="^$colored+diff"
pattern="^$colored+.*(\+|\-).*PATTERN"
git diff --color | sed -rn -e "/$marker/! H; /$marker/ ba; $ ba; b; :a; x; /$pattern/ p"
  • colored: टर्मिनल रंगीन रेखाओं से मेल करने के लिए रेगेक्स
  • marker: diffडिफरेंशियल हॉक से विभाजन को जोड़ने के लिए मार्कर , रंगीन "भिन्न" से शुरू होने वाली रेखाएं
  • pattern: पैटर्न खोज करने के लिए, रंगीन "+" या "-" और "PATTERN" युक्त लाइनें

यह जोड़ा गया या हटाए गए PATTERN के साथ पूर्ण रूप से अलग-अलग हिस्सों को प्रिंट करेगा, उपयोगी रंगीन आउटपुट भी बनाए रखेगा।

ध्यान दें कि ^[में coloredवास्तविक, शाब्दिक होना चाहिए ^[। आप उन्हें Ctrl+ V, Ctrl+ दबाकर बैश में टाइप कर सकते हैं[


अति उत्कृष्ट!! किसी व्यक्ति को बैश शेल के अलावा कहीं और इसे टाइप करने की कोशिश करने के लिए (जैसे कि IDE में .sh फ़ाइल को एडिट करना) आपको मैक को ^[पसंद colored=$'(\e\[[0-9;]*[a-zA-Z])'करने brew install gnu-sedऔर बदलने की भी आवश्यकता है और आपको बदलने की भी आवश्यकता हैsed --> gsed
एन्ट्रोपिक

0

यहां एक कस्टम डिफ टूल है जो बदलावों के अंदर पकड़ बनाने की अनुमति देता है (लेकिन संदर्भ नहीं):

प्रयोग

GIT_EXTERNAL_DIFF="mydiff --grep foo" git diff

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

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

filename: oldlinenum: newlinenum|

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

मायडिफ़

#!/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

विंडोज पर, एक सरल समाधान है:

git diff -U0 | findstr string

यदि आप फ़ाइल नाम से समूहीकरण करना चाहते हैं, तो इसका उपयोग करें

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

0

मैं इसे बहुत संतुष्टि के साथ उपयोग कर रहा हूँ :)

grep -ri <MY_PATTERN> $(git diff 790e26393d --name-only) 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.