2012-03-30 15 views
71

मैं चारों ओर देखा है पर एक निर्दिष्ट फ़ाइल में एक पंक्ति के लिए विभिन्न परिवर्तनों के सभी शो, और यकीन है कि अगर यह संभव है, लेकिन यहाँ नहीं हूँ चला जाता है:Git: पूरे Git इतिहास

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

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

मैं जो करना चाहता हूं वह उन अद्वितीय पहचानकर्ताओं को ढूंढता है जिन्हें हमने कभी भी उपयोग किया है। मैं इसे गिट के साथ कैसे कर सकता हूं?

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

वैसे भी, मैं यहां किसी भी अंतर्दृष्टि की सराहना करता हूं। धन्यवाद।

+2

संभावित डुप्लिकेट [फ़ाइल में किसी विशिष्ट पंक्ति के लिए प्रतिबद्ध लॉग पुनर्प्राप्त करें?] (Http://stackoverflow.com/questions/8435343/retrieve-the-commit-log-for-a- विशिष्ट-line-in -एक-फाइल) –

उत्तर

37

git-log और gitdiffcore के लिए मैन पेज देखें। मैं इस आदेश को यह करना होगा विश्वास करते हैं, लेकिन यह बिल्कुल सही नहीं हो सकता है:

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

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

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 उपयोग करने के लिए बदल दिया है।

+0

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

+0

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

+0

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

12

तुम भी gitk के साथ ऐसा कर सकते हैं:

gitk file.js 

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

+0

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

+2

क्या आपने 'git blame file.js' या' git gui blame file.js' की कोशिश की है? –

+0

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

6

तुम सिर्फ एक सा अनुकूलन हैं @ लूटने का जवाब, git log मूल रूप से यह आपके लिए क्या करेंगे, अगर आप सभी की जरूरत एक दृश्य तुलना है:

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

-U0 पैच मोड में निर्गम (-p), और शो का मतलब है पैच के चारों ओर संदर्भ की शून्य रेखाएं।

तुम भी शाखाओं में ऐसा कर सकते हैं:

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

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

+0

मेरे लिए काम किया! धन्यवाद। –

54

गिट 1.8 के बाद से।4, आपके प्रश्न का उत्तर देने के लिए एक और सीधा तरीका है।

कि लाइन 110 मान लिया जाये कि लाइन var identifier = "SOME_IDENTIFIER"; कह रहा है, तो ऐसा करते हैं:

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

यह वापस आ जाएगी हर प्रतिबद्ध जो कोड की है कि रेखा को छुआ।

[Git Documentation ("एल" कमांड लाइन paramenter देखें)]

2

magit में, आप

l, =L 

साथ ऐसा कर सकते यह तो, फ़ाइल के लिए आप पूछ सकते हैं और शुरू कर देंगे अंत लाइनों।