2012-06-21 17 views
22

मैं कभी-कभी कई शाखाओं वाले स्रोत कोड भंडारों के साथ काम करता हूं, जिनमें से अधिकांश पुराने होते हैं और आमतौर पर प्रासंगिक नहीं होते हैं।गिट में केवल सक्रिय/हाल ही में बदली गई शाखाओं को सूचीबद्ध करने के लिए कैसे?

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

पीएस .: मुझे एहसास है कि इसे "पुरानी" शाखाओं (जैसा कि What to do with experimental non-merged git branches? में चर्चा की गई है) को हटाकर हल किया जा सकता है, लेकिन यह हमेशा किसी दिए गए प्रोजेक्ट पर व्यावहारिक या स्वीकार नहीं किया जा सकता है।

+0

संभावित डुप्लिकेट [मैं हाल ही में प्रतिबद्धता द्वारा आदेशित गिट शाखाओं की सूची कैसे प्राप्त कर सकता हूं?] (Http://stackoverflow.com/questions/5188320/how-can-i-get-a-list-of -जिट-शाखा-आदेश-द्वारा-हालिया-प्रतिबद्ध) – sleske

+0

बस एहसास हुआ कि यह एक डुप्लिकेट है। – sleske

उत्तर

27

आप git-for-each-ref उपयोग कर सकते हैं पिछले की committer दिनांक के आधार पर अवरोही क्रम इस तरह प्रतिबद्ध में सॉर्ट सभी स्थानीय और ट्रैकिंग शाखाओं की एक सूची प्राप्त करने के लिए:

git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname)' refs/heads refs/remotes 

यह जैसे आउटपुट .:

2012-06-23 refs/heads/master 
2012-06-21 refs/remotes/origin/HEAD 
2012-06-21 refs/remotes/origin/master 

आप एम शाखाओं को प्राप्त करने के लिए --count=m जोड़ सकते हैं, तो आप कमिटर तिथि का उपयोग करने के बजाय --sort=-authordate कर सकते हैं, आप निश्चित रूप से विभिन्न प्रारूपों का उपयोग कर सकते हैं। for-each-ref स्वयं दिनांक के अनुसार परिणाम को सीमित नहीं करता है, इसे अलग से स्क्रिप्ट किया जाना चाहिए, लेकिन कम से कम आपके पास प्रतिबद्ध वस्तु से तारीखें हैं।

+1

कूल, * बिल्कुल * जो मैं खोज रहा था। यह विडंबनापूर्ण है कि यह वास्तव में पहले से ही गिट का हिस्सा है। शायद मुझे दस्तावेज़ों को पढ़ना चाहिए ... – sleske

+0

हाँ, मैं भी:/ – jkrcma

+4

पहले 'गिट रिमोट प्रिंस उत्पत्ति' चलाने के लिए मत भूलना, अन्यथा आपको पुरानी सूची मिल सकती है जो दूरस्थ साइट पर मौजूद नहीं है –

7
ls -1 --sort=time .git/refs/heads/ | while read b; do PAGER='' git log -n1 --color --pretty=format:'%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $b --; done; 

यह ऑनलाइनर सभी स्थानीय शाखाओं को नवीनतम समय से सबसे पुराने समय में क्रमबद्ध करता है। प्रत्येक शाखा में मानव पठनीय दिनांक स्ट्रिंग के साथ अंतिम प्रतिबद्धता है। आप इसे अपने .gitconfig में जोड़ सकते हैं।

दूरस्थ शाखाओं के लिए मैं इस डरावने समाधान के साथ आया था:

git ls-remote -h origin | while read b; do PAGER='' git log -n1 --color --pretty=format:'%ct%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $(echo $b | cut -d' ' -f1) --; done | sort -rn -k1,10 | cut -c11- 

संपादित करें: अधिक मुझे लगता है, और मैं, डर यह अविश्वसनीय हो सकते हैं हूँ क्योंकि ls-remote हमेशा जबकि log दूरदराज के पक्ष को जोड़ता है नहीं। इस आदेश के प्रत्येक भाग से पहले fetch करने की आवश्यकता हो सकती है।

+0

अच्छी चाल। दुर्भाग्यवश, यह केवल स्थानीय शाखाओं के लिए काम करता है, न कि दूरस्थ लोगों के लिए ('/ refs/remote' के अंतर्गत)। यह स्थानीय ट्रैकिंग शाखाओं के लिए भी काम नहीं करता है, क्योंकि रेफरी फ़ाइल का mtime आमतौर पर आखिरी (अपस्ट्रीम) प्रतिबद्ध नहीं, आखिरी fetch को दर्शाता है। – sleske

+0

@sleske मैं खोल जादू कर सकता हूं, अद्यतन उत्तर देखें :) – jkrcma

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

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