2012-07-25 22 views
87

पर कमेटी की संख्या की गणना करें मुझे यह उत्तर पहले से मिला है: Number of commits on branch in git लेकिन यह मानता है कि शाखा मास्टर से बनाई गई थी।गिट शाखा

मैं उस धारणा पर निर्भर के बिना शाखा के साथ काम करने की संख्या कैसे गिन सकता हूं?

एसवीएन में यह मामूली है, लेकिन कुछ कारणों से गिट में पता लगाना वास्तव में मुश्किल है।

+1

संभव डुप्लिकेट http://stackoverflow.com/questions/10913892/number-of-commits-on- शाखा-इन-गिट) – endrigoantonini

उत्तर

169

शाखा आप पर हैं के लिए प्रतिबद्ध गिनती करने के लिए: एक शाखा

git rev-list --count <branch-name> 

के लिए

git rev-list --count HEAD 

आप एक शाखा पर करता है कि आप के बाद से बना रहे हैं गिनती करने के लिए चाहते हैं शाखा

git rev-list --count HEAD ^<branch-name> 

यह कभी भी किए गए सभी कामों की गणना करेगा जो शाखा-नाम पर भी नहीं हैं।

उदाहरण

git checkout master 
git checkout -b test 
<We do 3 commits> 
git rev-list --count HEAD ^master 

परिणाम: 3

अपनी शाखा एक शाखा develop कहा जाता है की बात आती है, तो:

git checkout develop 
git checkout -b test 
<We do 3 commits> 
git rev-list --count HEAD ^develop 

परिणाम: 3

-बनाए गए

की उपेक्षा

यदि आप किसी भी शाखा को बिना किसी तेजी से वर्तमान शाखा में विलय करते हैं और आप ऊपर करते हैं, तो विलय भी गिना जाता है। ऐसा इसलिए है क्योंकि गिट के लिए एक विलय एक प्रतिबद्धता है।

आप गिनती करने के लिए नहीं करना चाहते हैं इन प्रतिबद्ध --no-merges जोड़ें:

git rev-list --no-merges --count HEAD ^develop 
+3

इनमें से कोई भी सही संख्या नहीं दिखाता है, उदाहरण के लिए मास्टर और ब्रैनकेम समान संख्या में काम दिखाते हैं। – botbot

+0

टिप्पणियां वास्तव में कोड की अनुमति नहीं देती हैं, लेकिन यह दिखाना चाहिए कि यह काम करता है। ==== $ गिट इनिट ==== $ टच test.txt ==== $ git add। ==== $ गिट प्रतिबद्ध-ए ==== $ गिट पुन: सूची - गणना HEAD => 1 ==== $ गिट पुन: सूची - गणना मास्टर => 1 ==== $ गिट चेकआउट -बी परीक्षण ==== $ गिट rev-list --count test => 1 ==== $ गिट पुन: सूची - गणना HEAD^मास्टर => 0 ==== $ टच test2। txt ==== $ git add। ==== $ गिट प्रतिबद्ध-ए ==== $ गिट पुन: सूची - गणना मास्टर => 1 ==== $ गिट पुन: सूची - गणना परीक्षण => 2 ==== $ गिट rev-list - गणना HEAD^मास्टर => 1 ==== –

+0

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

2

git log --pretty=oneline | wc -l के बारे में

कि अपने वर्तमान शाखा के नजरिए से सब करता गिनती चाहिए कैसे।

+0

आप किस कॉलम पर गिनती करते हैं? क्या यह पहला है? – Hengjie

1

ऐसा करने का एक तरीका आपकी शाखा के लिए लॉग सूचीबद्ध है और लाइनों की गिनती है।

git log <branch_name> --oneline | wc -l 
36

इस लाइन

git shortlog -s -n 

उत्पन्न होगा इस

135 Tom Preston-Werner 
15 Jack Danger Canty 
10 Chris Van Pelt 
7 Mark Reid 
6 remi 
+1

नाम से पहले ये संख्याएं क्या हैं? क्या तुम समझा सकते हो ? –

+3

@Ciastopiekarz ये प्रत्येक व्यक्ति द्वारा काम करने की संख्या है। –

23
तरह उत्पादन

यह एक अपेक्षाकृत आवश्यकता हो सकती है गिट का हालिया संस्करण, लेकिन यह मेरे लिए अच्छा काम करता है:

git rev-list --count develop..HEAD 

इससे मुझे वर्तमान शाखा में मास्टर की आधार पर काम करने की सटीक गणना मिलती है।

पीटर के उत्तर में आदेश, git rev-list --count HEAD ^develop में मेरे वर्तमान प्रोजेक्ट पर 678 बनाम 97 शामिल हैं।

मेरा प्रतिबद्ध इतिहास इस शाखा पर रैखिक है, इसलिए वाईएमएमवी, लेकिन यह मुझे सही जवाब देता है, जो कि "मैं इस सुविधा शाखा में कितने काम करता हूं?"।

+2

यह सही उत्तर है। – Dvole

0

आप गिट लॉग भी कर सकते हैं। grep प्रतिबद्ध | WC -l

और परिणाम वापस

+1

यह विश्वसनीय नहीं है। यह उन प्रतिबद्धताओं से मेल खाएगा जो उदाहरण के लिए दो बार प्रतिबद्ध संदेश में "प्रतिबद्ध" हैं। – rdb

+0

@rdb नहीं यह नहीं होगा।यह केवल आउटपुट * लाइनों की संख्या * शब्द "प्रतिबद्ध" युक्त होगा, इसलिए एक पंक्ति को कभी दो बार गिना नहीं जाएगा। – iBug

+0

@iBug: आप बिंदु खो रहे हैं। यदि प्रतिबद्ध संदेश में "प्रतिबद्ध" शब्द होता है, तो यह 'गिट लॉग' आउटपुट में "ए 1 बी 2 सी ..." लाइन से अलग पंक्ति पर दिखाई देता है, ताकि परिणाम में प्रतिबद्धता को दो बार गिना जाएगा। इससे भी बदतर अगर प्रतिबद्ध संदेश में दो अलग-अलग लाइनों पर दो बार "प्रतिबद्ध" शब्द शामिल था। – rdb

1

मैं git shortlog -s -n --all करना पसंद मिलता है। आपको नामों और कमियों की संख्या की "लीडरबोर्ड" शैली सूची देता है।

0

ठीक है, चयनित उत्तर काम नहीं करता है अगर आपने अपनी शाखा को अनिश्चित शाखा से बाहर कर दिया है (यानी master या develop)।

यहां मैं एक और तरीका प्रदान करता हूं जिसका उपयोग मैं अपने pre-push गिट हुक में कर रहा हूं।

# Run production build before push 
echo "[INFO] run .git/hooks/pre-push" 

echo "[INFO] Check if only one commit" 

# file .git/hooks/pre-push 
currentBranch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,') 

gitLog=$(git log --graph --abbrev-commit --decorate --first-parent HEAD) 

commitCountOfCurrentBranch=0 
startCountCommit="" 
baseBranch="" 

while read -r line; do 

    # if git log line started with something like "* commit aaface7 (origin/BRANCH_NAME)" or "commit ae4f131 (HEAD -> BRANCH_NAME)" 
    # that means it's on our branch BRANCH_NAME 

    matchedCommitSubstring="$([[ $line =~ \*[[:space:]]commit[[:space:]].*\((.*)\) ]] && echo ${BASH_REMATCH[1]})" 

    if [[ ! -z ${matchedCommitSubstring} ]];then 

     if [[ $line =~ $currentBranch ]];then 
     startCountCommit="true" 
     else 
     startCountCommit="" 

     if [[ -z ${baseBranch} ]];then 
      baseBranch=$([[ ${matchedCommitSubstring} =~ (.*)\, ]] && echo ${BASH_REMATCH[1]} || echo ${matchedCommitSubstring}) 

     fi 

     fi 

    fi 


    if [[ ! -z ${startCountCommit} && $line =~ ^\*[[:space:]]commit[[:space:]] ]];then 
     ((commitCountOfCurrentBranch++)) 
    fi 


done <<< "$gitLog" 

if [[ -z ${baseBranch} ]];then 

    baseBranch="origin/master" 

else 

    baseBranch=$([[ ${baseBranch} =~ ^(.*)\, ]] && echo ${BASH_REMATCH[1]} || echo ${baseBranch}) 

fi 


echo "[INFO] Current commit count of the branch ${currentBranch}: ${commitCountOfCurrentBranch}" 

if [[ ${commitCountOfCurrentBranch} -gt 1 ]];then 
    echo "[ERROR] Only a commit per branch is allowed. Try run 'git rebase -i ${baseBranch}'" 
    exit 1 
fi 

अधिक विश्लेषण के लिए कृपया देखें my blog

([Git में शाखा पर प्रतिबद्ध की संख्या] के
संबंधित मुद्दे