গিট শাখায় কমিটের সংখ্যা গণনা করুন


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

মার্জগুলিকে উপেক্ষা করা হচ্ছে

আপনি যদি দ্রুত ফরওয়ার্ড না করে বর্তমান শাখায় অন্য একটি শাখা মার্জ করে থাকেন এবং আপনি উপরের কাজটি করেন তবে মার্জটিও গণনা করা হয়। এটি কারণ গিটের জন্য মার্জ একটি প্রতিশ্রুতিবদ্ধ।

আপনি যদি এই কমিটগুলি গণনা করতে না চান তবে যুক্ত করুন --no-merges:

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

7
এর মধ্যে কোনওটিই সঠিক সংখ্যাটি দেখায় না, উদাহরণস্বরূপ মাস্টার এবং শাখার নাম একই সংখ্যার কমিট দেখায়।
বটবট

মন্তব্যগুলি আসলে কোডের অনুমতি দেয় না, তবে এটি এটি কার্যকর করে তা দেখানো উচিত। ==== it গিট টিম ==== $ টাচ টেস্ট.টেক্সট ==== it গিট অ্যাড। ==== it গিট কমিট -a ==== it গিট রেভ-তালিকা - হিসাব হেড => 1 ==== it গিট রেভ-তালিকা - হিসাবের মাস্টার => 1 ==== it গিট চেকআউট-বি পরীক্ষা ==== it গিট রেভ-তালিকা - হিসাব পরীক্ষা => 1 ==== it গিট রেভিস্ট-তালিকা - হিসাব শিরোনাম ^ মাস্টার => 0 ==== $ স্পর্শ পরীক্ষা 2.txt ==== $ গিট যোগ করুন ==== it গিট কমিট -a ==== it গিট রেভ-লিস্ট - অ্যাকাউন্ট মাস্টার => 1 ==== it গিট রেভ-তালিকা - হিসাব পরীক্ষা => ২ ==== it গিট রেভ-তালিকা - হিসাব শিরোনাম ^ মাস্টার => 1 ====
পিটার ভ্যান ডের

1
আমি @ বোটবোটের সাথে একমত এগুলি সত্যই সঠিক নয়। উদাহরণস্বরূপ, কিছু মার্জ কমিট যোগ করার চেষ্টা করুন বা টানুন / পুনর্বাসনা এবং অবিশ্বাস্য হয়ে উঠতে শুরু করে উপরের চিত্রিত হিসাবে গণনাগুলি লক্ষ্য করুন।
উইল মুর তৃতীয়

2
@ উইলমুর আপনার অর্থ একটি শাখা মার্জ করার পরে আপনি একটি অতিরিক্ত গণনা পেয়েছেন? এটি প্রযুক্তিগতভাবে প্রতিশ্রুতিবদ্ধ এবং তাই এটি গণনা করা হয়। তবে আপনি যদি এই কমিটগুলি গণনা করতে না চান তবে - কোনও-মার্জ যুক্ত করুন। আমি উত্তর আপডেট করব।
পিটার ভ্যান ডের

2
রেভ-তালিকা - হিসাবের পতাকা গিট 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
@ সাইস্তোপিকার্জ এগুলি প্রতিটি ব্যক্তির কমিটের সংখ্যা।
আস্নাদ আতা

39

এটির জন্য গিটের তুলনামূলক সাম্প্রতিক সংস্করণ প্রয়োজন হতে পারে তবে এটি আমার পক্ষে ভাল কাজ করে:

git rev-list --count develop..HEAD

এটি আমাকে বর্তমান শাখায় মাস্টার ভিত্তিতে ভিত্তিক কমিটের সঠিক গণনা দেয়।

পিটারের উত্তরের কমান্ডটিতে git rev-list --count HEAD ^developআমার বর্তমান প্রকল্পে 678 বনাম 97 টি আরও অনেক কমিট অন্তর্ভুক্ত রয়েছে।

আমার প্রতিশ্রুতিবদ্ধ ইতিহাস এই শাখায় রৈখিক, তাই ওয়াইএমএমভি, তবে এটি আমাকে সঠিক উত্তরটি চেয়েছিল যা "আমি এই বৈশিষ্ট্য শাখায় এখন পর্যন্ত কতগুলি প্রতিশ্রুতি যুক্ত করেছি?"।


একই হওয়া উচিত। ডক্স তাই বলছেন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
dosenmatter

আমি বিভ্রান্ত: git fetch upstream; BEHIND=$(git rev-list --count HEAD..upstream/master); git merge --ff-only upstream/master~$BEHIND;লাইন আপ না। পিছনে 1800 এর মতো হয় যখন বাস্তবে আপস্ট্রিম / মাস্টার ~ 400 একত্রীকরণের চেয়ে বড় কিছুই কিছুই না changes ব্যবহার করা --no-mergesখুব বেশি ভাল নয়, 900 এর মতো দেয় And -list।
dlamblin

7

ইতিহাসের শুরু থেকেই বর্তমান শাখায় কতটা কমিটমেন্ট করা হয়েছিল, মার্জ করা শাখা থেকে কমিট গণনা করা হয়নি:

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

ডকুমেন্টেশন গিট রেভ-তালিকা থেকে - সহায়তা :

--first-parent

মার্জ কমিট দেখে কেবল প্রথম পিতামাতার প্রতিশ্রুতি অনুসরণ করুন। একটি নির্দিষ্ট বিষয় শাখার বিবর্তন দেখার সময় এই বিকল্পটি আরও ভাল ওভারভিউ দিতে পারে, কারণ একটি বিষয় শাখায় মার্জ করা কেবল সময়ে সময়ে আপডেট স্ট্রিমের সাথে সামঞ্জস্য করার প্রবণতা রাখে এবং এই বিকল্পটি আপনাকে পৃথক পৃথক কমিটিকে উপেক্ষা করার সুযোগ দেয় যা এতে আনা হয় to যেমন একীভূত দ্বারা আপনার ইতিহাস। - বিস্কেক্টের সাথে একত্রিত করা যায় না।

দ্রষ্টব্য: অগভীর ক্লোন ইতিহাসের আকার সঙ্কুচিত করবে। যেমন আপনি যদি ক্লোন করেন তবে --depth 11 ফিরে আসবে।

অন্য কিছু প্রতিশ্রুতিবদ্ধ হওয়ার পরে করা কমিটের সংখ্যা :

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

বা একই:

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

বা অন্য কোনও গিট রেফারেন্স ব্যবহার করুন :

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 rev-list abc0923f .. - হিসাব - প্রথম - পিতা-মাতা আমার শাখার জন্য যথাযথ ফলাফল দিচ্ছেন তবে প্রথম কমান্ড একটি বড় মূল্য দিচ্ছে
জিস রাফেল

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

ওপি উল্লেখ করে গিটের শাখায় কমিট করার সংখ্যা উল্লেখ করে আমি যুক্ত করতে চাই যে সেখানে প্রদত্ত উত্তরগুলি অন্য কোনও শাখার সাথেও কাজ করে, কমপক্ষে গিট সংস্করণ ২.১.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

আপনি যদি ইউএনআইএক্স সিস্টেম ব্যবহার করেন তবে আপনি তা করতে পারেন

git log|grep "Author"|wc -l

-2

আপনি গিট লগও করতে পারেন | গ্রেপ কমিট | wc -l

এবং ফলাফল ফিরে পেতে


1
এটি নির্ভরযোগ্য নয়। উদাহরণস্বরূপ, প্রতিশ্রুতি বার্তায় দু'বার "প্রতিশ্রুতিবদ্ধ" কমিটগুলির সাথে এটি মিলবে।
rdb

@rdb না এটা হবে না এটি কেবল "কমিট" শব্দটি যুক্ত লাইনগুলির আউটপুট দেবে , সুতরাং একটি লাইন কখনও দু'বার গণনা হবে না।
iBug

@ আইবুগ: আপনি পয়েন্টটি মিস করছেন। যদি প্রতিশ্রুতিবদ্ধ বার্তাটিতে "কমিট" শব্দটি থাকে, তবে এটি আউটপুটে "কমিট এ 1 বি 2 সি ..." লাইন থেকে পৃথক লাইনে উপস্থিত হয় git log, যাতে ফলশ্রুতিতে প্রতিশ্রুতি দুটিবার গণনা করা হবে। আরও কম খারাপ যদি প্রতিশ্রুতি বার্তাটি দুটি পৃথক লাইনে দু'বার "প্রতিশ্রুতি" শব্দটি ধারণ করে।
rdb
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.