นับจำนวนการกระทำในสาขา Git


184

ฉันพบคำตอบนี้แล้ว: จำนวนการคอมมิชชันในสาขาในคอมไพล์ แต่ถือว่าเป็นสาขาที่สร้างจากมาสเตอร์

ฉันจะนับจำนวนการคอมมิชชันตามสาขาโดยไม่ต้องอาศัยข้อสันนิษฐานนั้นได้อย่างไร

ใน SVN นี่มันเล็กน้อย แต่ด้วยเหตุผลบางอย่างยากที่จะคิดออกในคอมไพล์


คำตอบ:


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
สิ่งเหล่านี้ไม่แสดงหมายเลขที่ถูกต้องตัวอย่างเช่น master และ branchname แสดงจำนวนการคอมมิชชันเดียวกัน
botbot

ความคิดเห็นไม่อนุญาตรหัสจริงๆ แต่ควรแสดงว่าใช้งานได้ ==== $ git init ==== $ touch test.txt ==== $ git เพิ่ม ==== $ git commit -a ==== $ git rev-list --count HEAD => 1 ==== $ git rev-list --count master => 1 ==== $ git checkout -b ทดสอบ ==== $ git rev-list - ทดสอบนับ> 1 ==== $ git rev-list - นับหัวหน้า ^ หลัก => 0 ==== $ touch test2.txt สัมผัส ==== $ git เพิ่ม ==== $ git commit -a ==== $ git rev-list - เคานท์มาสเตอร์ => 1 ==== $ git rev-list - การทดสอบนับ => 2 ==== $ git rev-list - นับหัวหน้า ^ master => 1 ====
ปีเตอร์แวนเดอร์ทำอย่างไร

1
ฉันเห็นด้วยกับ @botbot สิ่งเหล่านี้ไม่ถูกต้องจริงๆ ตัวอย่างเช่นลองเพิ่มการรวมการกระทำหรือการดึง / การรีบูตและสังเกตว่าจำนวนที่ปรากฎข้างต้นจะไม่น่าเชื่อถือ
Wil Moore III

2
@wilmoore คุณหมายความว่าคุณได้รับการนับเพิ่มหลังจากรวมสาขาหรือไม่? นี่เป็นการกระทำทางเทคนิคดังนั้นมันจึงถูกนับ แต่ถ้าคุณไม่ต้องการนับการคอมมิชชันเหล่านี้ก็จะเพิ่ม - ไม่มีการรวมเข้าด้วยกัน ฉันจะอัปเดตคำตอบ
Peter van der ไม่

2
rev-list - แฟล็กนับไม่มีอยู่ใน git 1.7 ตอนนี้คำแนะนำที่ downvote-to-hell ด้านล่างนี้ใช้git logงานได้ดีกว่าคำแนะนำอื่น ๆ
aaronbauman

60

หากต้องการดูจำนวนทั้งหมดที่ไม่ได้ผูกพันคุณสามารถทำได้ตามที่ Peter แนะนำไว้ข้างต้น

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
ตัวเลขเหล่านี้คืออะไรก่อนชื่อ? คุณสามารถอธิบาย ?
Ciasto piekarz

5
@Ciastopiekarz เหล่านี้คือจำนวนการกระทำที่แต่ละคนทำ
Asnad Atta

39

อาจต้องใช้ Git รุ่นที่ค่อนข้างเร็วกว่านี้ แต่ใช้ได้ดีสำหรับฉัน:

git rev-list --count develop..HEAD

สิ่งนี้ให้การนับจำนวนที่แน่นอนของฉันในสาขาปัจจุบันที่มีฐานเป็นหลัก

คำสั่งในคำตอบของปีเตอร์git rev-list --count HEAD ^developรวมถึงความมุ่งมั่นอื่น ๆ อีกมากมาย 678 vs 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
dosentmatter

ฉันสับสน: git fetch upstream; BEHIND=$(git rev-list --count HEAD..upstream/master); git merge --ff-only upstream/master~$BEHIND;ไม่เข้าแถว หลังเหมือน 1800 เมื่อในความเป็นจริงไม่มีอะไรมากไปกว่าการรวมอัปสตรีม / ต้นแบบ ~ 400 สร้างการเปลี่ยนแปลง การใช้--no-mergesไม่ได้ดีกว่ามากให้เหมือน 900 และถ้าฉันรวมเช่นนี้กับ ~ 800 และจำนวนรอบของรายการคือ 1800 จากนั้นฉันจะรวมกับ ~ 790 ฉันได้รับระหว่าง 6 และ 28 นับต่ำกว่าใน rev -รายการ.
dlamblin

7

จำนวนคอมมิชชันที่ทำกับสาขาปัจจุบันตั้งแต่จุดเริ่มต้นของประวัติศาสตร์ไม่นับคอมมิทจากการรวมสาขา:

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

จากเอกสารgit rev-list - ช่วย :

--first-parent

ทำตามเฉพาะผู้ปกครองคนแรกที่กระทำเมื่อเห็นการกระทำที่ผสาน ตัวเลือกนี้สามารถให้ภาพรวมที่ดีขึ้นเมื่อดูวิวัฒนาการของหัวข้อหัวข้อเฉพาะเนื่องจากการผสานเข้ากับสาขาหัวข้อมักจะเกี่ยวกับการปรับการอัปเดตอัปสตรีมเป็นครั้งคราวเท่านั้นและตัวเลือกนี้ช่วยให้คุณไม่สนใจการกระทำแต่ละรายการ ประวัติของคุณด้วยการรวม ไม่สามารถใช้ร่วมกับ --bisect

หมายเหตุ:โคลนตื้นจะลดขนาดประวัติ เช่นถ้าคุณโคลนด้วย--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

จำนวนการกระทำที่กระทำตั้งแต่ปี 2561

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 .. - นับ - ผู้ปกครองคนแรกให้ผลลัพธ์ที่เหมาะสมสำหรับสาขาของฉัน แต่คำสั่งแรกคือการให้คุณค่าที่ยิ่งใหญ่
Jiss Raphel

5

เกี่ยวกับ git log --pretty=oneline | wc -l

ที่ควรนับการกระทำทั้งหมดจากมุมมองของสาขาปัจจุบันของคุณ


คุณนับคอลัมน์อะไร มันเป็นอันแรกหรือเปล่า?
Hengjie

3

git shortlog -s -n --allฉันชอบทำ ให้รายชื่อสไตล์ "ลีดเดอร์บอร์ด" ของชื่อและจำนวนการกระทำ


2

วิธีหนึ่งในการทำคือแสดงรายการบันทึกสำหรับสาขาของคุณและนับจำนวนบรรทัด

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

1

คำตอบที่เลือกไม่ทำงานหากคุณแยกสาขาออกจากสาขาที่ไม่เจาะจง (เช่นไม่ใช่masterหรือdevelop)

ที่นี่ฉันเสนอวิธีอื่นที่ฉันใช้ในpre-pushhooks คอมไพล์ของฉัน

# 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

ในฐานะที่เป็น OP อ้างอิงจำนวนการคอมมิชชันในสาขาในคอมไพล์ฉันต้องการเพิ่มว่าคำตอบที่กำหนดนั้นยังทำงานร่วมกับสาขาอื่น ๆ อย่างน้อยตั้งแต่ git เวอร์ชั่น 2.17.1 (และดูเหมือนน่าเชื่อถือกว่าคำตอบของ Peter van der Does):

ทำงานอย่างถูกต้อง:

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

ในทั้งสองกรณีฉันได้รับจำนวนของความมุ่งมั่นทั้งหมดในสาขาการพัฒนาและปริญญาโทที่สาขา (ทางอ้อม) ลงมา



-2

คุณยังสามารถทำบันทึก git | grep commit | ห้องสุขา -l

และรับผลกลับมา


1
สิ่งนี้ไม่น่าเชื่อถือ มันจะจับคู่คอมมิตที่มี "ส่ง" ในข้อความยืนยันสองครั้ง
rdb

@rdb ไม่มันจะไม่ มันจะออกเฉพาะจำนวนบรรทัดที่มีคำว่า "กระทำ" ดังนั้นหนึ่งบรรทัดจะไม่ถูกนับสองครั้ง
iBug

@iBug: คุณไม่มีจุด หากข้อความคอมมิชชันมีคำว่า "commit" ข้อความนั้นจะปรากฏในบรรทัดแยกจากบรรทัด "commit a1b2c ... " ในgit logเอาต์พุตดังนั้นการคอมมิทจะถูกนับสองครั้งในผลลัพธ์ ยิ่งแย่ไปกว่านั้นถ้าข้อความการคอมมิชชันมีคำว่า "commit" สองครั้งในสองบรรทัดแยกกัน
rdb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.