मैं Git कमिट कैसे प्राप्त करूं?


752

मैं अपनी Git रिपॉजिटरी के कमिट्स की संख्या प्राप्त करना चाहूंगा, थोड़ा सा SVN संशोधन नंबर।

लक्ष्य यह एक अद्वितीय, वेतन वृद्धि संख्या के रूप में उपयोग करने के लिए है।

मैं वर्तमान में Unix / Cygwin / msysGit पर ऐसा करता हूं:

git log --pretty=format:'' | wc -l

लेकिन मुझे लगता है कि यह थोड़ा हैक है।

क्या ऐसा करने का एक बेहतर तरीका है? यह अच्छा होगा यदि मुझे वास्तव में wcया यहां तक ​​कि गिट की जरूरत नहीं है , इसलिए यह एक नंगे विंडोज पर काम कर सकता है। बस एक फ़ाइल या एक निर्देशिका संरचना पढ़ें ...


1
आपको यहाँ दिलचस्प उत्तर मिल सकते हैं: संशोधन संख्या के लिए समान क्या है?
सेबेस्टियन वरेट्टे

190
git rev-list HEAD --count git rev-list
जेक बर्गर

14
@jberger: मुझे लगता है कि आपकी टिप्पणी को एक उत्तर में बदलना चाहिए।
utapyngo

@utapyngo: 13 अन्य जवाब दिए गए, मुझे पता था कि इसे दफनाया जाएगा। मैंने इसे तब यहाँ पोस्ट किया है
जेक बर्गर

@jberger, यह उत्तर git1.7.0 के लिए काम नहीं करता है।
वोरैक

जवाबों:


1159

एक एक संशोधन (के लिए निर्धारित संख्या प्राप्त करने के लिए HEAD, master, एक हैश प्रतिबद्ध):

git rev-list --count <revision>

सभी शाखाओं में प्रतिबद्ध गणना प्राप्त करने के लिए:

git rev-list --all --count

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


27
git shortlog | grep -E '^[ ]+\w+' | wc -lयदि आप कुल संख्या प्राप्त करना चाहते हैं और git shortlog | grep -E '^[^ ]'यदि आप प्रत्येक अंशदाता के लिए कमिट संख्या प्राप्त करना चाहते हैं।
खोपड़ी

2
इशारा करने के लिए धन्यवाद wc -l। न्यूनतमवाद FTW। मैंने इसे अपने उत्तर में शामिल कर लिया।
बेंजामिन एटकिन

17
यह समाधान दोनों हैकी ( git log --pretty=format:'' | wc -lमूल प्रश्न में दिए गए दृष्टिकोण के समान ) और गलत है: आप इसे मैच में इन्वर्ट करके देख सकते हैं ( git shortlog | grep -Ev '^[ ]+\w+') और यह देखते हुए कि कोई संदेश नहीं है (जैसे, "<none>") को गिना नहीं जाता है। उपयोग करना git rev-list HEAD --countअधिक उपयुक्त और अधिक सटीक दोनों है।
ctrueden

17
@ बेनकिन: मेरी माफ़ी; यह मेरा इरादा आक्रामक होने का नहीं था, केवल तथ्यपूर्ण था। प्रतिक्रिया की तारीख के बारे में बताया गया। उस समय, आपका समाधान बहुत अच्छी तरह से उपलब्ध हो सकता है। लेकिन मैं अपने बयान के साथ खड़ा हूं जो git rev-list HEAD --countअब एक बेहतर समाधान है।
ctrueden

3
एक उत्तर के रूप में अच्छी तरह से जोड़ा और पुराने संस्करणों के साथ भी काम करता है:git log --oneline | wc -l
जिमी केन

155

git shortlog एक तरीका है।


5
Ty। यह मेरे लिए तब काम करता था जब गिनती एक सीमा में होती है; git shortlog sha1..sha2
RJFalconer

1
हां, गिट शॉर्टलॉग की पहली पंक्ति में इसमें कमिट्स की संख्या है। समस्या सुलझ गयी।
बजे रॉबर्ट मासैओली जूल

5
कमिटर्स की संख्या कमिट द्वारा समूहीकृत है, इतना अच्छा नहीं है। गिट शॉर्टलॉग में लाइनों की गिनती कर सकते हैं, लेकिन यह किसी कारण के लिए टर्मिनल के बिना ssh पर काम नहीं करता (पेजर?)। प्रश्नकर्ता का मूल समाधान सबसे अच्छा है! git log --pretty = format: '' | wc -l
सैम वाटकिंस

4
हालांकि, मैं git rev-list HEAD --countओपी में दिए गए मूल दृष्टिकोण के बजाय सुझाव दूंगा। मेरे परीक्षणों में, git log --pretty=format:'' | wc -lएक के बाद एक बंद है।
ctrueden

3
@ctrueden git log --oneline | wc -lएक (OS X 10.8.5) से दूर नहीं है।
एंडी स्टीवर्ट

111

git rev-list HEAD --count

जीआईटी सूची

git rev-list <commit>: सूची प्रतिबद्ध है कि दिया से माता-पिता लिंक का अनुसरण करके पहुंचा जा सकता है प्रतिबद्ध (इस मामले में, प्रमुख )।

--count : एक नंबर प्रिंट करें कि कितने कमिट सूचीबद्ध किए गए होंगे, और अन्य सभी आउटपुट को दबाएंगे।


100

यह कमांड कमिटर्स द्वारा समूहीकृत कमिट्स की गणना करता है:

git shortlog -s

आउटपुट:

14 John lennon
9  Janis Joplin

आप जानना चाह सकते हैं कि -sतर्क का संकुचन रूप है --summary


11
git shortlogअपने आप ही कुल संख्याओं के मूल प्रश्न (लेखक द्वारा समूहीकृत नहीं) को संबोधित नहीं करता है। git rev-list HEAD --countइसके बजाय उपयोग करें ।
22

5
बहुत बढ़िया! आप इसे | sort -nभी सॉर्ट कर सकते हैं
मोहसिन

54

यदि आप एक अद्वितीय और अभी भी काफी पढ़ने योग्य पहचानकर्ता के लिए देख रहे हैं, तो git वर्णन आपके लिए सिर्फ एक चीज हो सकती है।


2
यह काम कर सकता है और कस्टम-निर्मित एल्गो की तुलना में उपयोग करना अधिक आसान होगा। +1
वॉनक

2
मुझे पता नहीं था कि वर्णन नहीं है। टैग नाम और sha1 के बीच की यह छोटी सी संख्या बस वही है जिसकी मुझे तलाश थी। धन्यवाद।
स्प्लो

2
GIT-VERSION-GEN स्क्रिप्ट और इसे git रिपॉजिटरी में कैसे प्रयोग किया जाता है, और लिनक्स कर्नेल स्रोतों में इसी तरह की स्क्रिप्ट (और कैसे मेकफाइल में उनका उपयोग किया जाता है) पर एक नज़र डालें।
जकुब नारबस्की

यह अद्वितीय है, लेकिन INCREMENTAL आईडी नहीं देता है। मेरे लिए काम नहीं करता है। हालाँकि, बेन एटकिन के जवाब में कमिटेड काउंट्स हैं, जो व्यवहार में वृद्धिशील होने चाहिए। हारून डिगुल्ला का जवाब अधिक निश्चित है, लेकिन इसके लिए और भी अधिक काम करने की आवश्यकता है।
जोम

2
हाँ, यह है कि क्योंकि अवधारणा एक के वृद्धिशील आईडी वितरित संस्करण नियंत्रण प्रणाली के साथ किसी भी मतलब नहीं है।
बोम्बे

34

आप Git में "संशोधन संख्या" के बारे में सोचने वाले पहले व्यक्ति नहीं हैं , लेकिन ' wc' काफी खतरनाक है, क्योंकि प्रतिबद्ध को मिटाया जा सकता है या स्क्वैश किया जा सकता है, और इतिहास फिर से बदल सकता है।

"संशोधन संख्या" विशेष रूप से तोड़फोड़ के लिए महत्वपूर्ण थी क्योंकि मर्ज के मामले में इसकी आवश्यकता थी (SVN1.5 और उस मोर्चे पर 1.6 में सुधार हुआ है)।

आप एक प्री-कमिट हुक के साथ समाप्त हो सकते हैं जिसमें टिप्पणी में एक संशोधन संख्या शामिल होगी, जिसमें एल्गोरिथ्म सही संख्या निर्धारित करने के लिए शाखा के सभी इतिहास को शामिल नहीं करेगा।

बाजार वास्तव में इस तरह के एक एल्गोरिथ्म के साथ आया था, और यह एक अच्छा प्रारंभिक बिंदु हो सकता है कि आप क्या करना चाहते हैं।

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


हारून के विचार को स्पष्ट करने के लिए , आप Git कमिट हैश को एक एप्लिकेशन की "जानकारी" फ़ाइल में जोड़ सकते हैं जिसे आप अपने आवेदन के साथ वितरित कर रहे हैं।

इस तरह, बॉक्स के बारे में ऐसा लगेगा:

बॉक्स के बारे में

एप्लिकेशन संख्या कमिट का हिस्सा है, लेकिन 'एप्लिकेशन की "जानकारी" फ़ाइल पैकेजिंग प्रक्रिया के दौरान उत्पन्न होती है, जो प्रभावी रूप से एक तकनीकी संशोधन आईडी के लिए एक एप्लिकेशन बिल्ड नंबर को लिंक करती है ।


2
मैंने Xcode 3 के साथ काम करने के लिए अपनी स्क्रिप्ट को अपडेट किया है। आप gist.github.com/208825 से अद्यतित संस्करण उठा सकते हैं
अबिज़र्न

34

यू सिर्फ उपयोग कर सकते हैं:

git shortlog -s -n

परिणाम :

 827  user one
    15  user two
     2  Gest 

22

एक सरल तरीका है:

 git log --oneline | wc -l

oneline निश्चित करता है की।


1
'wc' को आंतरिक या बाहरी कमांड, ऑपरेबल प्रोग्राम या बैच फ़ाइल के रूप में मान्यता नहीं दी जाती है।
user815693

वैसे आप किस सिस्टम का इस्तेमाल कर रहे हैं? क्या यह यूनिक्स एक है? /
जिमी केन

1
यदि आपके पास हजारों कमिट हैं, तो यह तेजी से भी लगता है। अन्य सभी आदेशों में बहुत अधिक समय लगता है।
डैनी कूलॉम्बे

21

इसे एक चर में लाने के लिए, सबसे आसान तरीका है:

export GIT_REV_COUNT=`git rev-list --all --count`

5
वास्तव में, git rev-listउपयोग करने के लिए सही उपकरण है, git logअन्य की तरह नहीं ।
नायुकी

1
वंश तक पहुंचने की संख्या गिनने के लिए HEAD: git rev-list --first-parent | wc -l
२००:०

आप की जरूरत नहीं है wc -lबस का उपयोग --countस्विच: git rev-list --all --count
slm

धन्यवाद @ एसएलएम, मैंने जवाब अपडेट कर दिया है। हालांकि, मुझे संदेह है कि मूल उत्तर --countस्विच से ही पुराना है।
जॉन Gietzen

@ जॉनहॉज़ेन - ओह येह मुझे लगा कि 8-), बस इस विवरण को मदद करने के लिए जोड़ रहा था।
slm

17

कम विवरण प्राप्त करने का एक तरीका गिट शॉर्टलॉग है:

git shortlog -s -n

यह लेखक के नाम के बाद आने वाले कमिट की संख्या देगा। -S विकल्प लेखक द्वारा किए गए प्रत्येक कमिट के लिए सभी प्रतिबद्ध संदेशों को हटा देता है। यदि आप प्रतिबद्ध संदेश भी देखना चाहते हैं तो वही विकल्प निकालें। संपूर्ण सूची को सॉर्ट करने के लिए -n विकल्प का उपयोग किया जाता है। उम्मीद है की यह मदद करेगा।


2
git shortlogअपने आप ही कुल संख्याओं के मूल प्रश्न (लेखक द्वारा समूहीकृत नहीं) को संबोधित नहीं करता है। git rev-list HEAD --countइसके बजाय उपयोग करें ।
ctrueden


7

एक अच्छा सहायक स्क्रिप्ट है जो Git लोगों को Git वर्णन के आधार पर एक उपयोगी संस्करण संख्या उत्पन्न करने में मदद करने के लिए उपयोग करता है। मैं स्क्रिप्ट दिखाता हूं और इसे अपने उत्तर में समझाता हूं कि आप एक Git प्रोजेक्ट की फाइलों में करंट आईडी को कैसे शामिल करेंगे?


4

यदि आप सिर्फ एक शाखा का उपयोग कर रहे हैं, जैसे कि मास्टर, मुझे लगता है कि यह बहुत अच्छा काम करेगा:

git rev-list --full-history --all | wc -l

यह केवल एक नंबर आउटपुट करेगा। आप इसे कुछ इस तरह से दे सकते हैं

git revno

चीजों को वास्तव में सुविधाजनक बनाने के लिए। ऐसा करने के लिए, अपनी .git/configफ़ाइल को संपादित करें और इसे इसमें जोड़ें:

[alias]
    revno = "!git rev-list --full-history --all | wc -l"

यह विंडोज पर काम नहीं करेगा। मैं उस OS के लिए "wc" के बराबर नहीं जानता, लेकिन आपके लिए गिनती करने के लिए पायथन स्क्रिप्ट लिखना एक बहु-मंच समाधान होगा।

संपादित करें : दो कमिट्स के बीच गणना करें :


मैं एक ऐसे उत्तर की तलाश में था, जो यह बताए कि दो मनमाने संशोधनों के बीच कमिट्स की संख्या कैसे प्राप्त करें और कोई भी नहीं देखें।

git rev-list --count [older-commit]..[newer-commit]

3

निर्माण के दौरान एक संख्या उत्पन्न करें और इसे एक फ़ाइल में लिखें। जब भी आप कोई रिलीज़ करते हैं, तो टिप्पणी "बिल्ड 147" (या जो भी वर्तमान में बिल्ड नंबर है) के साथ उस फ़ाइल को कमिट करें। सामान्य विकास के दौरान फ़ाइल को कमिट न करें। इस तरह, आप आसानी से Git में संख्याओं और संस्करणों के बीच मैप कर सकते हैं।


यदि दो वितरित डेवलपर्स ने ऐसा किया है तो उनके बिल्ड नंबर समय-समय पर टकराते / टकराते नहीं हैं? क्या होगा अगर वे दोनों एक ही साझा रेपो के रिव्यू के बीच निर्माण करते हैं, या शायद टकराव केवल तब होगा जब या तो साझा रेपो के लिए प्रतिबद्ध नहीं थे। निश्चित नहीं।
hobs

ज़रूर लेकिन संघर्ष आपको बताता है कि क्या करना है: बस दूसरे आदमी से बात करें या हमेशा उच्च संख्या का उपयोग करें। याद रखें: एक संख्या जादुई रूप से एक टूटी हुई निर्माण प्रक्रिया को ठीक नहीं कर सकती है। यह सिर्फ एक अनुस्मारक या संकेत है जिसे आपको कुछ जांचने की आवश्यकता है।
आरोन दिगुल्ला

1
आह, हाँ, जादू buildno.txt फ़ाइल बाकी के साथ प्रतिबद्ध है। एक छोटी टीम के लिए अच्छा दृष्टिकोण, या एक बड़ी टीम जो समानांतर बिल्ड से बचती है। केवल जगह मैं सोच सकता हूं कि यह काम नहीं कर सकती है एक स्क्रिप्टेड भाषा (अजगर) का उपयोग करने वाली एक बड़ी टीम के लिए है जिसे निर्माण प्रक्रिया की आवश्यकता नहीं है (भवन निर्माण करने के लिए एक व्यक्ति को असाइन करने के लिए)।
हॉब्स

3

हमारी कंपनी में, हम SVN से Git में चले गए। रिवीजन नंबरों की कमी एक बड़ी समस्या थी!

करो git svn clone, और फिर अपने SVN संशोधन संख्या द्वारा अंतिम SVN को टैग करो :

export hr=`git svn find-rev HEAD`
git tag "$hr" -f HEAD

फिर आप रिवीजन नंबर की मदद से प्राप्त कर सकते हैं

git describe --tags --long

यह आदेश कुछ इस तरह देता है:

7603-3-g7f4610d

मीन्स: अंतिम टैग 7603 है - यह एसवीएन संशोधन है। 3 - इसमें से कमिट्स की गिनती है। हमें उन्हें जोड़ने की जरूरत है।

तो, इस स्क्रिप्ट द्वारा संशोधन संख्या को गिना जा सकता है:

expr $(git describe --tags --long | cut -d '-' -f 1) + $(git describe --tags --long | cut -d '-' -f 2)

1

मैं जिसका उपयोग करता था वह था:

git log | grep "^commit" | wc -l

सरल लेकिन यह काम किया।


4
यह गिनती करने के लिए "कमिट" के साथ एक कमिट मैसेज लाइन भीख मांगता है। उदाहरण के लिए: "गलतियाँ और टूटे हुए परीक्षण जिन्हें मैंने गलती से अंतिम \ _ ncommit में धकेला"
Paweł Polewicz

1

बैश वाक्य रचना का उपयोग करना,

$(git rev-list --count HEAD)

विशुद्ध रूप से रैखिक इतिहास के लिए ठीक दिखता है। यदि आप भी कभी-कभी शाखाओं (आधारित बंद master) से "संख्या" चाहते हैं , तो विचार करें:

$(git rev-list --count $(git merge-base master HEAD)).$(git rev-list --count ^master HEAD)

जब किसी चेकआउट से चला जाता है master, तो आप बस 1234.0या पसंद करते हैं। जब आप किसी शाखा के चेकआउट से भागते हैं 1234.13, तो आपको कुछ ऐसा मिलेगा , अगर उस शाखा पर 13 कमिट बने हैं। स्पष्ट रूप से यह केवल उपयोगी है क्योंकि आप किसी दिए गए masterसंशोधन से अधिक से अधिक एक शाखा पर आधारित हैं ।

--first-parent केवल अन्य शाखाओं को मर्ज करने से उत्पन्न होने वाले कुछ कमिट्स को दबाने के लिए माइक्रो नंबर में जोड़ा जा सकता है, हालांकि यह संभवतः अनावश्यक है।


1

तुम कोशिश कर सकते हो

git log --oneline | wc -l

या रिपॉजिटरी में योगदान करने वाले लोगों द्वारा किए गए सभी कमानों को सूचीबद्ध करने के लिए

git shortlog -s

1

git config --global alias.count 'rev-list --all --count'

यदि आप इसे अपने कॉन्‍फ़िगर में जोड़ते हैं, तो आप केवल कमांड को संदर्भित कर सकते हैं;

git count


0

इस तरह से गिट शॉर्टलॉग का उपयोग करें

git shortlog -sn

या एक उपनाम (ZSH आधारित टर्मिनल के लिए) बनाएं

# show contributors by commits alias gcall="git shortlog -sn"


0

कैसे बनाने के बारे में alias?

alias gc="git rev-list --all --count"      #Or whatever name you wish
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.