2011-12-23 9 views
35

गिट भंडार में फ़ाइलों के समूह के लिए आखिरी प्रतिबद्ध तिथि प्राप्त करने के लिए सबसे आसान एक-लाइनर क्या है (यानी, प्रत्येक फ़ाइल के लिए, उस फ़ाइल को बदलने वाली अंतिम प्रतिबद्धता की तारीख)?गिट में फ़ाइलों के समूह के लिए अंतिम प्रतिबद्ध तिथि कैसे प्राप्त करें?

इसके लिए संदर्भ यह है कि मैं कुछ मानदंडों से मेल खाने वाली फ़ाइलों की एक लंबी सूची खोजने के लिए अन्य बैश कमांड का उपयोग कर रहा हूं, और मैं प्रत्येक सूची के लिए अंतिम प्रतिबद्धता प्राप्त करने के लिए बस इस सूची को गिट कमांड में पाइप करना चाहता हूं फ़ाइल।

+0

क्या आप कभी भी गिट उपनाम बनाने में सक्षम थे या जो भी फाइलों के समूह की प्रतिबद्ध तिथियां डंप करते हैं? मेरे पास फाइलों और फ़ोल्डर्स/फाइलों आदि के साथ एक मूल फ़ोल्डर है। मैं उस फ़ोल्डर में पिछली बार कुछ भी देखना चाहता हूं। – Terry

उत्तर

60

निम्न आदेश उपयोगी होगा:

git log -1 --format=%cd filename.txt 

यह एक फ़ाइल के लिए नवीनतम परिवर्तन की तिथि से प्रिंट होगा। -1 एक लॉग प्रविष्टि (सबसे हालिया) दिखाता है, और --format=%cd प्रतिबद्धता दिनांक दिखाता है। विकल्पों के पूर्ण विवरण के लिए git-log के लिए प्रलेखन देखें।

आपको फ़ाइलों के समूह के लिए आसानी से इसे विस्तारित करने में सक्षम होना चाहिए।

+1

यह सहायक है। क्या प्रत्येक फ़ाइल का नाम दिनांक से कुछ की तारीख से जुड़ाव करने का एक बेहतर तरीका है: 'x में $ (कुछ-कमांड) के लिए; echo $ x $ (गिट लॉग -1 --format =% cd $ x) करें; done'? – jonderry

+0

मुझे ऐसा नहीं लगता है, क्योंकि सभी '%' स्वरूपण कोड किसी व्यक्तिगत * फ़ाइल * की बजाय * प्रतिबद्ध * को संदर्भित करते हैं। 'echo' वहाँ सबसे सरल तरीका हो सकता है। –

+3

वर्थ इंगित करता है कि '% ci' आउटपुट आईएसओ (आईएसएच) स्वरूपित तिथियां; तो आप उन्हें सॉर्ट कर सकते हैं। साथ ही '% ai' लेखक दिनांक की बजाय लेखक की तारीख को आउटपुट करता है। –

8

ग्रेग के उत्तर को थोड़ा विस्तार से, git log इसके तर्क में कई पथ ले सकता है। इसके बाद यह केवल उन कामों को दिखाएगा जिनमें वे पथ शामिल थे। इसलिए, नवीनतम फ़ाइलें के एक समूह के लिए प्रतिबद्ध पाने के लिए:

git log -1 --format=%cd -- fileA.txt fileB.txt fileC.txt 

मैं खोल पटकथा पर बहुत बकवास कर रहा हूँ, इसलिए मैं वास्तव में यकीन है कि कैसे पाइपिंग के माध्यम से उस आदेश के निर्माण के लिए नहीं कर रहा हूँ, लेकिन शायद यह है कि हो जाएगा एक और सवाल के लिए एक अच्छा विषय।

+2

हाँ, लेकिन यह प्रत्येक फ़ाइल * के लिए नवीनतम प्रतिबद्ध * की बजाय सभी फ़ाइलों के कामों के बीच नवीनतम प्रतिबद्धता देता है। – Cameron

+0

यह काम करता है लेकिन दुख की बात है कि ट्रेविससीआई पर्यावरण के अंदर नहीं। जब ट्रैविससीआई रिपो क्लोन करता है तो सभी फाइल तिथियां क्लोन की तारीख और समय (आज/अब) होती हैं और रिपो में क्या है, इसकी तिथि और समय नहीं होती है। अधिक निराश। – MitchellK

+0

मैंने ट्रैविससीआई के साथ यहां कोई समस्या दर्ज की है यदि कोई और रुचि रखता है> https://github.com/travis-ci/travis-ci/issues/8539 – MitchellK

1

यहाँ एक खोज का उपयोग कर एक लाइनर है (पठनीयता के लिए कई में टूट, लेकिन पीछे बैकस्लैश करने के लिए धन्यवाद, कॉपी-पेस्ट काम करना चाहिए):

find <dirs...> -name '<pattern>' <any other predicate to get what you want> \ 
    -exec git log -1 --format="AAA%ai NNN" '{}' \; \ 
    -exec echo '{}' XXX \; \ 
| tr \\n N | sed -e 's/AAA/\n/g' | sed -e 's/NNNN/ /g' -e 's/XXX.*//g' 

बहुत जटिल न्यू लाइन टीआर साथ mangling और sed सिर्फ वहाँ है एक पंक्ति पर दिनांक और फ़ाइल नाम प्राप्त करने के लिए, और अनचाहे फ़ाइलों को अनदेखा करने के लिए। आपको यह सुनिश्चित करना होगा कि आपकी कोई भी फाइल उन मूर्खतापूर्ण मार्कर एएए XXX एनएनएनएन न हो।

संबंधित मुद्दे