एक गिट शाखा पर कमिट की संख्या की गणना करें


184

मुझे यह उत्तर पहले से ही मिल गया था: गिट में शाखा पर आने की संख्या लेकिन यह माना जाता है कि शाखा मास्टर से बनाई गई थी।

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

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


जवाबों:


349

जिस शाखा पर आप हैं उसके लिए कमिट्स की गणना करना:

git rev-list --count HEAD

एक शाखा के लिए

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

यदि आप उस शाखा पर कमिट्स की गणना करना चाहते हैं जो आपके द्वारा बनाई गई शाखा है

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

विलय की अनदेखी

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

यदि आप इन कमिट्स को जोड़ना नहीं चाहते हैं --no-merges:

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

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

टिप्पणियाँ डॉन; वास्तव में कोड की अनुमति नहीं है, लेकिन यह दिखाना चाहिए यह काम करता है। ==== $ git init ==== $ स्पर्श test.txt ==== $ git add। ==== $ git कमिट -a ==== $ git रि-लिस्ट --count HEAD => 1 ==== $ git रि-लिस्ट --count master => 1 ==== $ git चेकआउट -b test ==== $ git रि-लिस्ट --count test => 1 ==== $ git रि-लिस्ट --count HEAD ^ मास्टर => 0 ==== $ टच test2.txt ==== $ git जोड़ते हैं। ==== $ git कमिट -a ==== $ git रि-लिस्ट-count master => 1 ==== $ git रि-लिस्ट --count test => 2 ==== $ git रि-लिस्ट --count HEAD ^ मास्टर => 1 ====
पीटर वान डेर

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

2
@wilmoore आपका मतलब है कि एक शाखा के विलय के बाद आपको एक अतिरिक्त गिनती मिलती है? यह तकनीकी रूप से एक प्रतिबद्ध है, और इसलिए इसे गिना जाता है। लेकिन अगर आप इन कमिट्स को जोड़ना नहीं चाहते हैं तो -नहीं-मर्ज कर सकते हैं। मैं जवाब अपडेट कर दूंगा।
पीटर वैन डेर

2
Rev-list -count ध्वज git 1.7 में मौजूद नहीं है। अभी, नीचे उपयोग git logकिए जाने वाले नरक के सुझाव किसी भी अन्य सुझावों की तुलना में बेहतर काम कर रहे हैं।
अरोनबौमन

60

यह देखने के लिए कि पीटर ने जैसा कि ऊपर सुझाया है, आप ऐसा नहीं कर सकते

git rev-list --count HEAD

और यदि आप प्रत्येक व्यक्ति द्वारा किए गए कमिट की संख्या देखना चाहते हैं, तो इस लाइन को आज़माएं

git shortlog -s -n

इस तरह आउटपुट उत्पन्न करेगा

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

3
नामों से पहले ये संख्याएँ क्या हैं? क्या तुम समझा सकते हो ?
सियासतो पाइक्ज

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

39

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

git rev-list --count develop..HEAD

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

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

इस शाखा पर मेरा प्रतिबद्ध इतिहास रैखिक है, इसलिए YMMV, लेकिन यह मुझे सटीक उत्तर देता है जो मैं चाहता था, जो है "इस सुविधा शाखा में मैंने अब तक कितने कमिट जोड़े हैं?"।


समान होना चाहिए। डॉक्स तो कहते हैंA special notation "<commit1>..<commit2>" can be used as a short-hand for "^'<commit1>' <commit2>". For example, either of the following may be used interchangeably: $ git rev-list origin..HEAD $ git rev-list HEAD ^origin
2

मैं उलझन में हूँ: git fetch upstream; BEHIND=$(git rev-list --count HEAD..upstream/master); git merge --ff-only upstream/master~$BEHIND;अस्तर नहीं है। BEHIND 1800 की तरह है जब वास्तव में मर्ज अपस्ट्रीम / मास्टर ~ 400 से अधिक कुछ भी नहीं होता है जो परिवर्तन पैदा करता है। का उपयोग करना --no-mergesबेहतर नहीं है, 900 की तरह देता है। और अगर मैं ~ 800 के साथ इस तरह एक मर्ज करता हूं, और रेव-लिस्ट काउंट 1800 है, तो मैं ~ 790 के साथ एक मर्ज करता हूं, मुझे 6 और 28 के बीच में कम गिनती मिलती है। -सूची।
dlamblin

7

इतिहास की शुरुआत से वर्तमान शाखा के लिए कितना कमिट किया गया था, मर्ज की गई शाखाओं से कमिट्स गिनना नहीं:

git rev-list HEAD --count --first-parent

प्रलेखन git की सूची से --help :

--first-parent

मर्ज कमिट देखने के बाद केवल पहले माता-पिता का पालन करें। किसी विशेष विषय शाखा के विकास को देखते हुए यह विकल्प एक बेहतर अवलोकन दे सकता है, क्योंकि विषय शाखा में विलय केवल समय-समय पर अद्यतन अपस्ट्रीम में समायोजित करने के बारे में होता है, और यह विकल्प आपको अंदर लाए गए व्यक्तिगत कमिट्स को अनदेखा करने की अनुमति देता है। ऐसे मर्ज से आपका इतिहास। - संयुक्त के साथ जोड़ा नहीं जा सकता।

नोट: उथला क्लोन इतिहास का आकार छोटा कर देगा। जैसे अगर आप क्लोन करते हैं --depth 1, तो 1 वापस आ जाएगा।

कुछ अन्य प्रतिबद्धताओं के बाद से किए गए कमिट की संख्या:

git rev-list HEAD abc0923f --count --first-parent

या समान:

git rev-list abc0923f.. --count --first-parent

या किसी अन्य git संदर्भ का उपयोग करें :

git rev-list master tag-v20 --count --first-parent

गणना 2018 वर्ष के बाद से की जाती है

git rev-list HEAD --count --first-parent --since=2018-01-01

01-01-2018, 01.01.2018, 2018.01.01 भी काम करता है।


git rev-label

मैंने Git से संस्करण-पुनरीक्षण प्राप्त करने के लिए एक स्क्रिप्ट लिखी, जैसे '$refname-c$count-g$short$_dirty'कि यह विस्तार करता है master-c137-gabd32ef
स्क्रिप्ट में ही मदद शामिल है।


Git रेव-सूची abc0923f .. --count --first माता पिता अपनी शाखा के लिए उचित परिणाम दे रहा है, लेकिन पहले आदेश एक बड़ा मूल्य दे रही है
Jiss Raphel

5

कैसा रहेगा git log --pretty=oneline | wc -l

अपनी वर्तमान शाखा के दृष्टिकोण से सभी कमिटों को गिनना चाहिए।


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

3

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


2

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

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

1

यदि आप अपनी शाखा को अनिर्दिष्ट शाखा से बाहर निकाल देते हैं (तो, नहीं 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

अधिक विश्लेषण के लिए, कृपया मेरे ब्लॉग पर जाएँ


1

जैसा कि ओपी संदर्भ बताता है कि गिट में शाखा पर आने की संख्या मैं जोड़ना चाहता हूं कि दिए गए उत्तर भी किसी अन्य शाखा के साथ काम करते हैं, कम से कम गिट संस्करण 2.17.1 के बाद से (और पीटर वैन डेर के जवाब की तुलना में बहुत अधिक विश्वसनीय लगता है):

सही ढंग से काम करना:

git checkout current-development-branch
git rev-list --no-merges --count master..
62
git checkout -b testbranch_2
git rev-list --no-merges --count current-development-branch..
0

आखिरी कमांड जीरो कमिट्स देती है जैसा कि मैंने अभी-अभी ब्रांच बनाया है। इससे पहले कि कमान मुझे मेरे विकास-शाखा के मर्ज-कमिट (एस) पर वास्तविक संख्या प्रदान करती है

सही ढंग से काम नहीं करना:

git checkout current-development-branch
git rev-list --no-merges --count HEAD
361
git checkout -b testbranch_1
git rev-list --no-merges --count HEAD
361

दोनों ही मामलों में मुझे विकास शाखा और मास्टर में सभी कमिट्स की संख्या मिलती है जिनसे शाखाएँ (अप्रत्यक्ष रूप से) नीचे उतरती हैं।


1

यदि आप UNIX प्रणाली का उपयोग कर रहे हैं, तो आप कर सकते हैं

git log|grep "Author"|wc -l

-2

आप git log भी कर सकते हैं | grep कमिट | wc -l

और परिणाम वापस प्राप्त करें


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

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

@ आईबग: आप इस बिंदु को याद कर रहे हैं। यदि प्रतिबद्ध संदेश में "कमिट" शब्द शामिल है git log, तो आउटपुट में "कमिट a1b2c ..." लाइन से एक अलग लाइन दिखाई देती है , इसलिए उस परिणाम में दो बार गणना की जाएगी। इससे भी बदतर अगर प्रतिबद्ध संदेश में दो अलग-अलग लाइनों पर दो बार "कमिट" शब्द शामिल था।
rdb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.