Đếm số lượng xác nhận trên một nhánh Git


184

Tôi đã tìm thấy câu trả lời này rồi: Số lần xác nhận trên nhánh trong git nhưng giả định rằng nhánh được tạo từ chủ.

Làm thế nào tôi có thể đếm số lượng cam kết dọc theo một nhánh mà không dựa vào giả định đó?

Trong SVN điều này là tầm thường, nhưng vì một số lý do thực sự khó khăn để tìm ra trong git.


Câu trả lời:


349

Để đếm các cam kết cho chi nhánh bạn đang trên:

git rev-list --count HEAD

cho một chi nhánh

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

Nếu bạn muốn đếm các cam kết trên một nhánh được tạo từ khi bạn tạo nhánh

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

Điều này sẽ tính tất cả các cam kết từng được thực hiện mà không phải trên tên chi nhánh.

Ví dụ

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

Kết quả: 3

Nếu chi nhánh của bạn đến một chi nhánh gọi là develop:

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

Kết quả: 3

Bỏ qua hợp nhất

Nếu bạn hợp nhất một nhánh khác vào nhánh hiện tại mà không chuyển tiếp nhanh và bạn thực hiện như trên, việc hợp nhất cũng được tính. Điều này là do git hợp nhất là một cam kết.

Nếu bạn không muốn đếm những cam kết này, hãy thêm --no-merges:

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

7
không ai trong số này hiển thị đúng số, ví dụ chủ và tên nhánh hiển thị cùng số lần xác nhận.
botbot

Nhận xét không thực sự cho phép mã, nhưng điều này sẽ cho thấy nó hoạt động. ==== $ git init ==== $ touch test.txt ==== $ git thêm. ==== $ git commit -a ==== $ git rev-list --count HEAD => 1 ==== $ git rev-list --count master => 1 ==== $ git checkout -b test ==== $ git rev-list - test test => 1 ==== $ git rev-list --count HEAD ^ master => 0 ==== $ touch test2.txt ==== $ git thêm vào . ==== $ git commit -a ==== $ git rev-list --count master => 1 ==== $ git rev-list - test test => 2 ==== $ git rev-list --count Head ^ master => 1 ====
Peter van der Liệu

1
Tôi đồng ý với @botbot. Những điều này không thực sự chính xác. Ví dụ: thử thêm một số cam kết hợp nhất hoặc kéo / rebase và chú ý các số đếm như mô tả ở trên bắt đầu trở nên không đáng tin cậy.
Wil Moore III

2
@wilmoore Bạn có nghĩa là bạn có được một số lượng thêm sau khi bạn hợp nhất một chi nhánh? Đây là một cam kết kỹ thuật, và vì vậy nó được tính. nhưng nếu bạn không muốn tính những cam kết này thì hãy thêm - không hợp nhất. Tôi sẽ cập nhật câu trả lời.
Peter van der Liệu

2
rev-list - cờ đếm không tồn tại trong git 1.7. Ngay bây giờ, các đề xuất từ ​​dưới lên xuống dưới đây git logđang hoạt động tốt hơn bất kỳ đề xuất nào khác.
aaronbauman

60

Để xem tổng số cam kết bạn có thể làm như Peter đã đề xuất ở trên

git rev-list --count HEAD

Và nếu bạn muốn xem số lượng cam kết được thực hiện bởi mỗi người, hãy thử dòng này

git shortlog -s -n

sẽ tạo đầu ra như thế này

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

3
những con số này trước tên là gì? bạn có thể giải thích ?
Ciasto piekarz

5
@Ciastopiekarz đây là số lần cam kết của mỗi người.
Asnad Atta

39

Nó có thể yêu cầu một phiên bản Git tương đối gần đây, nhưng điều này hoạt động tốt với tôi:

git rev-list --count develop..HEAD

Điều này mang lại cho tôi một số lượng chính xác các cam kết trong chi nhánh hiện tại có cơ sở dựa trên chủ.

Lệnh trong câu trả lời của Peter, git rev-list --count HEAD ^developbao gồm nhiều cam kết hơn, 678 so với 97 trong dự án hiện tại của tôi.

Lịch sử cam kết của tôi là tuyến tính trên nhánh này, vì vậy YMMV, nhưng nó cho tôi câu trả lời chính xác mà tôi muốn, đó là "Tôi đã thêm bao nhiêu cam kết cho nhánh tính năng này?".


Nên giống nhau. Các tài liệu nói như vậy . 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

Tôi bối rối: git fetch upstream; BEHIND=$(git rev-list --count HEAD..upstream/master); git merge --ff-only upstream/master~$BEHIND;không xếp hàng. BEHIND giống như 1800 khi trong thực tế không có gì lớn hơn hợp nhất ngược dòng / master ~ 400 tạo ra các thay đổi. sử dụng --no-mergeskhông tốt hơn nhiều, cho ra 900. Và nếu tôi thực hiện hợp nhất như thế này với ~ 800, và số lượng danh sách rev là 1800, thì tôi thực hiện hợp nhất với ~ 790 tôi nhận được từ 6 đến 28 số đếm thấp hơn trong rev -danh sách.
dlamblin

7

Có bao nhiêu cam kết được thực hiện cho chi nhánh hiện tại kể từ khi bắt đầu lịch sử, không tính các cam kết từ các chi nhánh được hợp nhất:

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

Từ tài liệu git rev-list - trợ giúp :

--first-parent

Chỉ theo dõi cam kết cha mẹ đầu tiên khi thấy một cam kết hợp nhất. Tùy chọn này có thể cung cấp một cái nhìn tổng quan tốt hơn khi xem sự phát triển của một nhánh chủ đề cụ thể, bởi vì việc hợp nhất thành một nhánh chủ đề có xu hướng chỉ là điều chỉnh để cập nhật ngược dòng theo thời gian và tùy chọn này cho phép bạn bỏ qua các cam kết riêng lẻ được đưa vào lịch sử của bạn bằng cách hợp nhất như vậy. Không thể kết hợp với - bisect.

Lưu ý: Bản sao nông sẽ thu nhỏ kích thước lịch sử. Ví dụ: nếu bạn nhân bản với --depth 1, sẽ trả về 1.

số lần xác nhận được thực hiện kể từ một số cam kết khác:

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

hoặc giống nhau:

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

hoặc sử dụng bất kỳ tài liệu tham khảo git nào khác :

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

Đếm số lần thực hiện kể từ năm 2018

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

01-01-2018, 01.01.2018, 2018.01.01 cũng hoạt động.


git rev-label

Tôi đã viết một kịch bản để có được phiên bản sửa đổi từ Git ở định dạng như '$refname-c$count-g$short$_dirty'mở rộng ra master-c137-gabd32ef.
Trợ giúp được bao gồm cho chính kịch bản.


git rev-list abc0923f .. --count --first-Parent đang đưa ra kết quả phù hợp cho chi nhánh của tôi nhưng lệnh đầu tiên mang lại giá trị lớn
Jiss Raphel

5

Làm thế nào về git log --pretty=oneline | wc -l

Điều đó sẽ tính tất cả các cam kết từ quan điểm của chi nhánh hiện tại của bạn.


Bạn đếm cột nào? Đây có phải là cái đầu tiên không?
Hengjie

3

Tôi thích làm git shortlog -s -n --all. Cung cấp cho bạn một danh sách kiểu "bảng xếp hạng" về tên và số lượng cam kết.


2

Một cách để làm điều đó là liệt kê nhật ký cho chi nhánh của bạn và đếm các dòng.

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

1

Chà, câu trả lời được chọn không hoạt động nếu bạn rẽ nhánh của mình ra khỏi nhánh không đặc biệt (nghĩa là không masterhoặc develop).

Ở đây tôi cung cấp một cách khác mà tôi đang sử dụng trong pre-pushmóc git của mình .

# 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

Để biết thêm phân tích, vui lòng truy cập blog của tôi


1

Khi tham chiếu OP Số lần xác nhận trên nhánh trong git tôi muốn thêm rằng các câu trả lời đã cho cũng có tác dụng với bất kỳ nhánh nào khác, ít nhất là từ phiên bản git 2.17.1 (và dường như đáng tin cậy hơn câu trả lời của Peter van der Does):

hoạt động chính xác:

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

Lệnh cuối cùng cho số không cam kết như mong đợi vì tôi vừa tạo chi nhánh. Lệnh trước cho tôi số lần xác thực trên nhánh phát triển của tôi trừ đi (các) cam kết hợp nhất

không hoạt động chính xác:

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

Trong cả hai trường hợp, tôi nhận được số lượng tất cả các cam kết trong nhánh phát triển và chủ từ đó các nhánh (gián tiếp) hạ xuống.


1

Nếu bạn đang sử dụng một hệ thống UNIX, bạn có thể làm

git log|grep "Author"|wc -l

-2

Bạn cũng có thể làm git log | cam kết grep | wc -l

và nhận lại kết quả


1
Điều này không đáng tin cậy. Ví dụ, nó sẽ khớp với các cam kết có "cam kết" trong thông điệp cam kết.
rdb

@rdb Không, nó sẽ không. Nó sẽ chỉ xuất số lượng dòng có chứa từ "cam kết", vì vậy một dòng sẽ không bao giờ được tính hai lần.
iBug

@iBug: Bạn đang thiếu điểm. Nếu thông báo cam kết chứa từ "cam kết", nó sẽ xuất hiện trên một dòng riêng biệt từ dòng "commit a1b2c ..." trong git logđầu ra, do đó, cam kết sẽ được tính hai lần trong kết quả. Thậm chí tệ hơn nếu thông điệp cam kết chứa từ "cam kết" hai lần trên hai dòng riêng biệt.
rdb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.