2012-11-19 13 views
20

git आदेशअच्छी तरह से प्रदर्शित फ़ाइल Git लॉग

git log --format='%H' --follow -- foo.txt 

आप प्रतिबद्ध है कि स्पर्श foo.txt की श्रृंखला दे देंगे में इतिहास का नाम बदलने के लिए, निम्न यह भर में नाम बदलता है।

मुझे आश्चर्य है कि git log कमांड है जो प्रत्येक प्रतिबद्धता के बगल में संबंधित ऐतिहासिक फ़ाइल नाम भी प्रिंट करेगा।

यह ऐसा कुछ होगा, जहां हम फ़ाइल नाम के लिए (वास्तव में मौजूद नहीं) प्लेसहोल्डर होने के लिए '%F' की व्याख्या कर सकते हैं।

git log --format='%H %F' --follow -- foo.txt 

मैं जानता हूँ कि इस

git log --format='%H' --follow --numstat -- foo.txt 

साथ पूरा किया जा सकता है, लेकिन क्योंकि यह कुछ गैर तुच्छ पार्स की आवश्यकता है उत्पादन आदर्श नहीं है; प्रत्येक प्रतिबद्धता कई पंक्तियों में फैली हुई है, और आपको अभी भी फ़ाइल का नाम बदलने के लिए सिंटैक्स ("bar.txt => foo.txt") का विश्लेषण करने की आवश्यकता होगी।

+0

% एच एक छोटी प्रतिबद्ध हैश के लिए लंबे समय से कोशिश '% h' है। संपादित करें: और आप सही हैं '% F' मौजूद नहीं है लेकिन'% f' करता है। –

उत्तर

16

आप इसे इस तरह एक छोटा सा आसान बनाने में कर सकते हैं:

git log --format='%H' --name-only --follow -- README.md 

जो आप की तरह इस

621175c4998dfda8da 

README.md 
d0d6ef0a3d22269b96 

README.md 

के उत्पादन में तरह दे देंगे जो पार्स करने के लिए थोड़ा आसान होना चाहिए। उदाहरण के लिए यदि आप एक प्रहरी का उपयोग करें और इस तरह से नई-पंक्तियों बाहर sed कर सकते हैं:

git log --format='%H%%' --name-only --follow -- README.md | sed ':a;N;$!ba;s/%\n\n/ /g' 

जो आप हैश और एक ही लाइन पर फ़ाइल नाम देना चाहिए: एसईडी मंगलाचरण पर जानकारी के लिए

621175c4998dfda8da README.md 
d0d6ef0a3d22269b96 README.md 

, How can I replace a newline (\n) using sed? देखें जिसका उत्तर मैं उस पर आधारित हूं।

14

--name-status आप के लिए काम करना चाहिए:

git log --follow --name-status --format='%H' -- foo.txt 

परिणाम इस तरह दिखेगा और आसानी से पर्ल या पायथन द्वारा पार्स किया जा सकता:

'4da4d5e3e9c24251e14d20004a853b72bd096cce' 

R100 b.txt c.txt 
'4966238c97198d096f0424a0a23ec550297d8086' 

M  b.txt 
'c0e41c11f0f7c5a7650cedfbad138c8941444023' 

R100 a.txt b.txt 
'4b2318c0fbabd836d50cabd70bf19013d3964856' 

A  a.txt 

आप एक में इसे पाने के लिए जोर देते हैं तो लाइन, यह पर्ल एक-लाइनर चाल करता है (यह विंडोज़ पर काम करता है। लिनक्स पर, सिंगल कोट्स का उपयोग करें या $ से \$ के रूप में):

git log --follow --name-status --format='%H' -- c.txt | perl -e "while(<>){chomp;print;<>;$_=<>;print q/ /,((split/\t/)[-1]);}" 

प्रिंट जो:

'4da4d5e3e9c24251e14d20004a853b72bd096cce' c.txt 
'4966238c97198d096f0424a0a23ec550297d8086' b.txt 
'c0e41c11f0f7c5a7650cedfbad138c8941444023' b.txt 
'4b2318c0fbabd836d50cabd70bf19013d3964856' a.txt 
0

यह OSX टर्मिनल में काम करता है:

git log --format='%%%h' --name-only --follow -- README.md | xargs echo | perl -pe 's/\%/\n/g' 
संबंधित मुद्दे