Git: पूरे गिट इतिहास पर एक निर्दिष्ट फ़ाइल में एक एकल लाइन के लिए सभी विभिन्न परिवर्तनों को दिखाएं


112

मैंने चारों ओर देखा है, और यकीन नहीं है कि यह संभव है, लेकिन यहाँ जाता है:

मेरे पास एक (जावास्क्रिप्ट) फ़ाइल है (जैसे /lib/client.js) जिसमें मेरे पास एक विशिष्ट पहचानकर्ता है जिसे एक चर को सौंपा गया है, जैसे: var identifier = "SOME_IDENTIFIER";

आप संस्करण संख्या की तरह पहचानकर्ता के बारे में सोच सकते हैं: समय-समय पर, हम इस चर को एक नए पहचानकर्ता में बदल देंगे।

मैं जो कुछ भी करना चाहता हूं वह उन सभी विशिष्ट पहचानकर्ताओं को मिल रहा है जिनका हमने कभी उपयोग किया है। मैं इसे git के साथ कैसे कर सकता हूं?

मुझे लगता है कि गिट इतिहास के माध्यम से खोज करने और लाइन मिलान को प्रिंट करने का एक तरीका हो सकता है "var identifier ="। मैं मैन्युअल रूप से इस सूची को डी-डुबो सकता था।

वैसे भी, मैं यहाँ किसी भी जानकारी की सराहना करेंगे। धन्यवाद।


जवाबों:


106

1.8.4 git के बाद से , आपके प्रश्न का उत्तर देने का एक और सीधा तरीका है।

यह मानकर कि रेखा 110यह कह रही है var identifier = "SOME_IDENTIFIER";, तब ऐसा करें:

git log -L110,110:/lib/client.js

यह हर उस प्रतिबद्धता को लौटाएगा जो कोड की उस रेखा को छूती है।

[ Git प्रलेखन ("-L" कमांड लाइन पैरामेंटर देखें)]


49

के लिए आदमी पृष्ठ देखें git-logऔर gitdiffcore। मेरा मानना ​​है कि यह आदेश यह करेगा, लेकिन यह काफी सही नहीं हो सकता है:

git log -G "var identifier =" file.js

संपादित करें: यहां वास्तविक लाइनों को दिखाने के लिए एक बैश स्क्रिप्ट के लिए एक कठिन शुरुआत है। यह वही हो सकता है जो आप ढूंढ रहे हैं।

for c in $(git log -G "something" --format=%H -- file.js); do
    git --no-pager grep -e "something" $c -- file.js
done

यह कमिट हैश की सूची का उत्पादन करने के लिए git log -G, दिलचस्प आवागमन खोजने के लिए उपयोग करता है --format=%H। यह तब प्रत्येक दिलचस्प कमिट पर निर्भर करता है, git grepजो उस कमिट से लाइनें दिखाने के लिए कहता है और फाइल जिसमें रीजैक्स होता है, कमिट हैश के साथ प्रीफैज होता है।


संपादित करें: टिप्पणियों में सुझाए गए अनुसार उपयोग -Gकरने के लिए परिवर्तित -S


@Rob - इसके लिए धन्यवाद - आपकी स्क्रिप्ट में छोटा-सा संपादन हालांकि - केवल फ़ाइल नाम डालने से पता चलता है कि बस उस फ़ाइल को प्रभावित करता है - यदि कोई प्रतिबद्ध अन्य फ़ाइलों को संदर्भित करता है तो यह सूचीबद्ध नहीं है
एड्रियन कोर्निश

@ एड्रियनकोर्निश - खुशी है कि यह मददगार था। मुझे लगता है कि ओपी केवल एक फ़ाइल को देखना चाहता था, लेकिन आप काफी सही हैं कि फ़ाइल नाम को हटाना संभवतः अधिक उपयोगी स्क्रिप्ट है।
लूटने

मेरे पास अधिक कठिन स्थिति है। विचाराधीन फ़ाइल paht_a / फ़ाइल से path_b / फ़ाइल में चली गई। अब जब मैं इसे path_b में करता हूं तो यह केवल तभी परिवर्तन दिखाता है जब फ़ाइल path_a से path_b पर जाती है। अगर मैं इसे path_a में करता हूं तो यह मुझे घातक बताता है: अस्पष्ट तर्क 'फ़ाइल': अज्ञात संशोधन या कार्यशील पेड़ में पथ नहीं।
एंडी सॉन्ग

@AndySong - यदि आप जिस स्ट्रिंग की खोज कर रहे हैं, वह काफी अनोखी है, तो शायद आप फ़ाइल का नाम छोड़ सकते हैं और फिर भी वह प्राप्त कर सकते हैं जो आप खोज रहे हैं।
लूट

मेरे लिए अधिक सुविधाजनक था - प्रत्येक कमिट के बाद एक खाली लाइन रखें, पंक्तियों को sfile=path/to/some_file; sfind='string_to_find'; for c in $(git log -G $sfind --format=%H -- $sfile); do git --no-pager grep -e $sfind -n $c -- $sfile; echo; done
सीमित करें

14

आप इसे gitk के साथ भी कर सकते हैं:

gitk file.js

"प्रतिबद्ध" ड्रॉप डाउन में, "जोड़ने / हटाने स्ट्रिंग:" चुनें और इसके बगल में पाठ बॉक्स में, "var आइडेंटिफ़ायर =" दर्ज करें, और जो भी स्ट्रिंग जोड़ते हैं या हटाते हैं, उस स्ट्रिंग को हाइलाइट किया जाएगा।


इसने उस प्रतिबद्ध को इंगित करने में मदद की जिस पर लाइन "var आइडेंटिफ़ायर =" को जोड़ा गया था, लेकिन यह बाद के कमिट नहीं दिखा रहा है जिसने इस लाइन को संशोधित किया है।
20

2
क्या आपने कोशिश की git blame file.jsया git gui blame file.js?
ईथन ब्राउन

1
मुझे पता है कि गिट दोष क्या करता है; मैं संशोधनों का पूरा इतिहास खोज रहा हूं, एक भी अंतर नहीं।
findchris

1
git gui blame file.jsऐसा करेंगे ... यह आपको एक फ़ाइल के सभी संशोधन दिखाएगा और जिसने इसे बदल दिया; आप केवल इतिहास के माध्यम से पीछे की ओर क्लिक कर सकते हैं।
ईथन ब्राउन

मैं नेत्रहीन के माध्यम से कदम के साथ समाप्त हो गया। मुझे लगता है कि ऐसा करने के लिए कुछ सुरुचिपूर्ण तकनीक है, लेकिन गिटक काफी अच्छा था। धन्यवाद।
ढूंढना

9

यदि आप @ रोब के उत्तर को थोड़ा सा अनुकूलित git logकरते हैं, तो मूल रूप से यह आपके लिए होगा, अगर आपको केवल एक दृश्य तुलना की आवश्यकता है:

git log -U0 -S "var identifier =" path/to/file

-U0पैच मोड ( -p) में आउटपुट का अर्थ है , और पैच के चारों ओर संदर्भ की शून्य रेखाएं दिखाना।

आप इसे शाखाओं के पार भी कर सकते हैं:

git log -U0 -S "var identifier =" branchname1 branchname2 -- path/to/file

अलग हेडर को दबाने का एक तरीका हो सकता है, लेकिन मुझे एक का पता नहीं है।


मेरे लिए काम किया! धन्यवाद।
रॉबर्टो बोनीनी

3

मैजिट में , आप इसके साथ कर सकते हैं

l, =L

यह आपसे फाइल और स्टार्ट, एंड लाइन्स के लिए पूछेगा।

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