2015-11-12 2 views
9

में कोड के गिट ट्रैकिंग ब्लॉक को हटा दिया गया हैmyfile.extension पर SOME CHANGE के साथ प्रतिबद्ध निकाय (प्रतिबद्धता शीर्षक/मेटाडेटा) में पर पुरानी प्रतिबद्धता है।कोड

कैसे मैं एक diff निरीक्षण करने के लिए बिना संशोधित (न केवल वर्तमान) करता HEADmd5hash से करने के लिए अग्रणी में SOME CHANGE साथ प्रतिबद्ध की एक सूची उत्पन्न कर सकते हैं? (जिनमें से दुर्भाग्यवश वर्तमान मामले में कई हैं।)

मैंने git rev-list --all | xargs git grep 'SOME CHANGE' की कोशिश की लेकिन ऐसा लगता है कि SOME CHANGE के साथ सभी कामों को फ़ाइल में है।

git blame बेकार लगता है क्योंकि रेखाएं बदल गई हैं और SOME CHANGE स्थानांतरित हो गया है।

उत्तर

4

मुझे लगता है कि आप जिस उत्तर को खोज रहे हैं वह git --no-pager log --pretty="%H" -G"SOME CHANGE" -- myfile.extension है।

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

# git --no-pager log --oneline -S"SOME CHANGE" 
12e24ed Remove text 
9427ffc Add the text 
# git --no-pager log --oneline -G"SOME CHANGE" 
12e24ed Remove text 
6a33653 Change other text on same line 
ac09bbb Append other text to same line 
484b447 Move the text two lines down 
9427ffc Add the text 
# git --no-pager log --oneline 
12e24ed Remove text 
9c7f7d5 Change text on adjacent line 
6a33653 Change other text on same line 
ac09bbb Append other text to same line 
484b447 Move the text two lines down 
377936f Add other text on adjacent line 
9427ffc Add the text 
1929648 Initial commit 

सिर्फ हैश के साथ इसे पाने के लिए:

# git --no-pager log --pretty="%H" -G"SOME CHANGE" 
12e24ed749e499bc2d8920c5d8a3ca98a6422e3f 
6a336532210ca85dea86968c34cef516345b8ab4 
ac09bbb5c95bbea65e7c99c730653d27f90397f4 
484b4478e4cb16c839dac558f3e958683b428a64 
9427ffc7dd60a3cfb1d9880083e6262faea0eefb 
0

यह अब भी परिणाम से जूझने का एक सा की आवश्यकता होगी, लेकिन यह आप प्राप्त कर सकते हैं और करीब:

git rev-list --all | xargs git show | egrep '(^ ?[+-].*(SOME CHANGE)|^commit)' | egrep -B1 '^ ?[+-]' | uniq 

यह प्रत्येक के लिए प्रतिबद्ध के लिए पैच पता चलता है, शा इसे देख रहा है पता चलता है, और फिर लाइन बाहर थूक कोड जो मेल खाता है। मैच के लिए प्रासंगिक शा मैच से ऊपर है।

यदि आप जाने के लिए एक व्यवहार्य तरीका है तो आप परिणाम को और भी साफ करने के लिए पाइपलाइन आगे बढ़ा सकते हैं।

0

मुझे लगता है कि आप देख रहे हैं: मतभेद है कि एक फ़ाइल में निर्दिष्ट स्ट्रिंग (अर्थात इसके अलावा/विलोपन) की घटनाओं की संख्या में परिवर्तन के लिए

git log -S<string> 

देखो। स्क्रिप्टर के उपयोग के लिए इरादा।

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