Làm thế nào để tôi có được số lượng cam kết Git?


753

Tôi muốn nhận số lượng cam kết của kho Git của mình, giống như số sửa đổi SVN.

Mục tiêu là sử dụng nó như một số bản dựng tăng dần, duy nhất.

Tôi hiện đang làm như vậy, trên Unix / Cygwin / msysGit:

git log --pretty=format:'' | wc -l

Nhưng tôi cảm thấy đó là một chút hack.

Có cách nào tốt hơn để làm điều đó? Thật tuyệt nếu tôi thực sự không cần wchoặc thậm chí là Git, vì vậy nó có thể hoạt động trên Windows trống. Chỉ cần đọc một tập tin hoặc một cấu trúc thư mục ...


1
Bạn có thể tìm thấy câu trả lời thú vị ở đây: git tương đương với số sửa đổi là gì?
Sebastien Varrette

190
git rev-list HEAD --count danh sách git rev
Jake Berger

14
@jberger: Tôi nghĩ bình luận của bạn nên được chuyển đổi thành một câu trả lời.
utaccngo

@utaccngo: đưa ra 13 câu trả lời khác, tôi biết nó sẽ bị chôn vùi. Tôi đã đăng nó ở đây rồi.
Jake Berger

@jberger, câu trả lời này không hoạt động cho git1.7.0.
Vorac

Câu trả lời:


1160

Để có được số lượng cam kết cho một sửa đổi ( HEAD,, masterbăm xác nhận):

git rev-list --count <revision>

Để có được số lượng cam kết trên tất cả các chi nhánh:

git rev-list --all --count

Tôi khuyên bạn không nên sử dụng số này cho mã định danh bản dựng, nhưng nếu bạn phải, tốt nhất nên sử dụng số đếm cho chi nhánh mà bạn đang xây dựng. Bằng cách đó, bản sửa đổi giống nhau sẽ luôn có cùng một số. Nếu bạn sử dụng số đếm cho tất cả các chi nhánh, hoạt động trên các chi nhánh khác có thể thay đổi số lượng.


27
git shortlog | grep -E '^[ ]+\w+' | wc -lnếu bạn muốn nhận được tổng số và git shortlog | grep -E '^[^ ]'nếu bạn muốn nhận số cam kết cho mỗi người đóng góp.
skalee

2
Cảm ơn đã chỉ ra wc -l. Chủ nghĩa tối giản FTW. Tôi kết hợp nó vào câu trả lời của tôi.
Benjamin Atkin

17
Giải pháp này là cả hacky (tương tự như git log --pretty=format:'' | wc -lcách tiếp cận được đưa ra trong câu hỏi ban đầu) và không chính xác: bạn có thể thấy điều này bằng cách đảo ngược trận đấu ( git shortlog | grep -Ev '^[ ]+\w+') và thấy rằng ví dụ như cam kết không có thông báo (ví dụ: "<none>") không được tính. Sử dụng git rev-list HEAD --countlà cả ngắn gọn và chính xác hơn.
ctrueden

17
@BenAtkin: Lời xin lỗi của tôi; đó không phải là ý định tấn công của tôi, chỉ đơn thuần là sự thật. Điểm lấy về ngày trả lời. Vào thời điểm đó, giải pháp của bạn rất có thể là giải pháp tốt nhất hiện có. Nhưng tôi đứng trước tuyên bố của tôi đó git rev-list HEAD --countlà một giải pháp tốt hơn bây giờ.
ctrueden

3
Đã thêm một câu trả lời và cũng hoạt động với các phiên bản cũ:git log --oneline | wc -l
Jimmy Kane

155

git shortlog là một cách


5
Ty. Điều này làm việc cho tôi khi đếm các cam kết trong một phạm vi; git shortlog sha1..sha2
RJFalconer

1
Đúng, dòng đầu tiên của git shortlog có số lần xác nhận trong đó. Vấn đề được giải quyết.
Robert Massaioli

5
Số lượng cam kết được nhóm theo committer, không tốt lắm. Có thể đếm các dòng trong git shortlog, nhưng điều này không hoạt động trên ssh mà không có thiết bị đầu cuối vì một số lý do (máy nhắn tin?). Giải pháp ban đầu của người hỏi là tốt nhất! nhật ký git --pretty = định dạng: '' | wc -l
Sam Watkins

4
Tuy nhiên, tôi sẽ đề xuất git rev-list HEAD --countthay vì cách tiếp cận ban đầu được đưa ra trong OP. Trong các thử nghiệm của tôi, git log --pretty=format:'' | wc -lđược tắt bởi một.
ctrueden

3
@ctrueden git log --oneline | wc -lkhông tắt bởi một (OS X 10.8.5).
Andy Stewart

111

git rev-list HEAD --count

danh sách git rev

git rev-list <commit>: Liệt kê các cam kết có thể truy cập bằng cách theo các liên kết cha từ cam kết đã cho (trong trường hợp này là CHÍNH ).

--count : In một số cho biết có bao nhiêu cam kết sẽ được liệt kê và triệt tiêu tất cả các đầu ra khác.


101

Lệnh này trả về số lượng xác nhận được nhóm bởi các ủy viên:

git shortlog -s

Đầu ra:

14 John lennon
9  Janis Joplin

Bạn có thể muốn biết rằng -sđối số là dạng co --summary.


11
git shortlogbởi chính nó không giải quyết câu hỏi ban đầu của tổng số lần xác nhận (không được nhóm theo tác giả). Sử dụng git rev-list HEAD --countthay thế.
ctrueden

5
Tuyệt vời! Bạn có thể sắp xếp nó bằng | sort -nquá
Mohsen

54

Nếu bạn đang tìm kiếm một mã định danh duy nhất và vẫn khá dễ đọc cho các cam kết, mô tả git có thể chỉ là thứ dành cho bạn.


2
Điều đó có thể làm việc và sẽ dễ sử dụng hơn một thuật toán tùy chỉnh. +1
VonC

2
Tôi không biết mô tả git. Con số nhỏ giữa tên thẻ và sha1 chính là thứ tôi đang tìm kiếm. Cảm ơn bạn.
Splo

2
Hãy xem tập lệnh GIT-VERSION-GEN và cách nó được sử dụng trong kho git và tập lệnh tương tự trong các nguồn nhân Linux (và cách chúng được sử dụng trong Makefile).
Jakub Narębski

Điều này cung cấp cho id duy nhất, nhưng không TĂNG CƯỜNG. Không làm việc cho tôi. Tuy nhiên, câu trả lời của Ben Atkin đưa ra số lượng cam kết, trong thực tế nên tăng dần. Câu trả lời của Aaron Digulla chắc chắn hơn, nhưng cũng đòi hỏi nhiều công việc hơn.
JOM

2
Vâng, đó là bởi vì các khái niệm của một gia tăng ID không thực hiện bất kỳ ý nghĩa với các hệ thống kiểm soát phiên bản phân phối.
Bombe

34

Bạn không phải là người đầu tiên nghĩ về "số sửa đổi" trong Git , nhưng ' wc' khá nguy hiểm, vì cam kết có thể bị xóa hoặc xóa, và lịch sử được xem lại.

"Số sửa đổi" đặc biệt quan trọng đối với Subversion vì nó cần thiết trong trường hợp hợp nhất (SVN1.5 và 1.6 đã được cải thiện ở mặt trước đó).

Bạn có thể kết thúc với một hook pre-commit bao gồm số sửa đổi trong bình luận, với một thuật toán không liên quan đến việc tra cứu tất cả lịch sử của một nhánh để xác định số chính xác.

Bazaar thực sự đã đưa ra một thuật toán như vậy , và nó có thể là điểm khởi đầu tốt cho những gì bạn muốn làm.

(Như câu trả lời của Bombe chỉ ra, Git thực sự có một thuật toán riêng, dựa trên thẻ mới nhất, cộng với số lần xác nhận, cộng với một chút khóa SHA-1). Bạn sẽ thấy (và upvote) câu trả lời của anh ấy nếu nó phù hợp với bạn.


Để minh họa ý tưởng của Aaron , bạn cũng có thể nối băm cam kết Git vào tệp "thông tin" của ứng dụng mà bạn đang phân phối với ứng dụng của mình.

Theo cách đó, hộp về sẽ trông như sau:

Giới thiệu về hộp

Số ứng dụng là một phần của cam kết, nhưng 'tệp "thông tin" của ứng dụng được tạo trong quá trình đóng gói, liên kết hiệu quả số xây dựng ứng dụng với id sửa đổi kỹ thuật .


2
Tôi đã cập nhật tập lệnh của mình để hoạt động với Xcode 3. Bạn có thể chọn phiên bản cập nhật từ gist.github.com/208825 .
Abizern

34

Bạn chỉ có thể sử dụng:

git shortlog -s -n

Kết quả :

 827  user one
    15  user two
     2  Gest 

22

Một cách đơn giản là:

 git log --oneline | wc -l

oneline đảm bảo rằng.


1
'wc' không được công nhận là lệnh nội bộ hoặc bên ngoài, chương trình có thể hoạt động hoặc tệp bó.
dùng815693

Bạn đang sử dụng hệ thống nào? Đây có phải là một UNIX không? /
Jimmy Kane

1
Điều này dường như cũng nhanh hơn nếu bạn có hàng ngàn cam kết. Tất cả các lệnh khác mất quá nhiều thời gian.
Daniel Coulombe

21

Để biến nó thành một biến, cách dễ nhất là:

export GIT_REV_COUNT=`git rev-list --all --count`

5
Thật vậy, git rev-listlà công cụ chính xác để sử dụng, không git loggiống như những người khác nói.
Nayuki

1
Để đếm số lượng cam kết trong dòng dõi để đạt được CHÍNH: git rev-list --first-Parent | wc -l
200_success

Bạn không cần wc -lchỉ sử dụng công --counttắc : git rev-list --all --count.
slm

Cảm ơn @slm, tôi đã cập nhật câu trả lời. Mặc dù, tôi nghi ngờ câu trả lời ban đầu là cũ hơn so với --countchính công tắc.
John Gietzen

@JohnGietzen - oh yeah tôi đoán rằng 8-), chỉ cần thêm chi tiết này để giúp đỡ.
slm

17

Git shortlog là một cách để có được các chi tiết cam kết:

git shortlog -s -n

Điều này sẽ đưa ra số lượng cam kết theo sau là tên tác giả. Tùy chọn -s xóa tất cả các thông báo cam kết cho mỗi cam kết mà tác giả đã thực hiện. Xóa tùy chọn tương tự nếu bạn cũng muốn xem các thông điệp cam kết. Tùy chọn -n được sử dụng để sắp xếp toàn bộ danh sách. Hi vọng điêu nay co ich.


2
git shortlogbởi chính nó không giải quyết câu hỏi ban đầu của tổng số lần xác nhận (không được nhóm theo tác giả). Sử dụng git rev-list HEAD --countthay thế.
ctrueden



4

Nếu bạn chỉ sử dụng một nhánh, chẳng hạn như chủ, tôi nghĩ rằng điều này sẽ hoạt động rất tốt:

git rev-list --full-history --all | wc -l

Điều này sẽ chỉ xuất ra một số. Bạn có thể đặt bí danh cho nó giống như

git revno

để làm cho mọi thứ thực sự thuận tiện. Để làm như vậy, chỉnh sửa .git/configtệp của bạn và thêm nó vào:

[alias]
    revno = "!git rev-list --full-history --all | wc -l"

Điều này sẽ không hoạt động trên Windows. Tôi không biết tương đương với "wc" cho HĐH đó, nhưng viết một tập lệnh Python để đếm cho bạn sẽ là một giải pháp đa nền tảng.

EDIT : Nhận số giữa hai lần xác nhận:


Tôi đang tìm kiếm một câu trả lời cho thấy làm thế nào để có được số lượng cam kết giữa hai lần sửa đổi tùy ý và không thấy bất kỳ.

git rev-list --count [older-commit]..[newer-commit]

3

Tạo một số trong quá trình xây dựng và ghi nó vào một tệp. Bất cứ khi nào bạn thực hiện một bản phát hành, hãy cam kết tệp đó với nhận xét "Build 147" (hoặc bất kể số bản dựng hiện tại là gì). Đừng cam kết tập tin trong quá trình phát triển bình thường. Bằng cách này, bạn có thể dễ dàng ánh xạ giữa số bản dựng và phiên bản trong Git.


Nếu hai nhà phát triển phân tán đã làm điều này thì số xây dựng của họ sẽ va chạm / giao nhau theo định kỳ? Điều gì sẽ xảy ra nếu cả hai cùng thực hiện một bản dựng giữa cùng một vòng lặp của một repo được chia sẻ, hoặc có lẽ xung đột sẽ chỉ xảy ra nếu một trong hai thay đổi không được cam kết với repo được chia sẻ. Không chắc.
hobs

Chắc chắn nhưng xung đột cho bạn biết phải làm gì: Chỉ cần nói chuyện với anh chàng kia hoặc luôn sử dụng số cao hơn. Hãy nhớ rằng: Một số không thể chữa một cách kỳ diệu một quy trình xây dựng bị hỏng. Đó chỉ là một lời nhắc nhở hoặc gợi ý rằng bạn cần kiểm tra một cái gì đó.
Aaron Digulla

1
À, vâng, tập tin ma thuật buildno.txt được cam kết cùng với phần còn lại. Cách tiếp cận tốt cho một nhóm nhỏ, hoặc một nhóm lớn tránh các bản dựng song song. Nơi duy nhất tôi có thể nghĩ rằng nó có thể không hoạt động tốt là dành cho một nhóm lớn sử dụng ngôn ngữ kịch bản (python) không cần quá trình xây dựng (để chỉ định một người làm việc xây dựng).
hobs

3

Trong công ty của chúng tôi, chúng tôi đã chuyển từ SVN sang Git. Thiếu số sửa đổi là một vấn đề lớn!

Làm git svn clone, và sau đó gắn thẻ cam kết SVN cuối cùng bằng số sửa đổi SVN của nó:

export hr=`git svn find-rev HEAD`
git tag "$hr" -f HEAD

Sau đó, bạn có thể nhận được số sửa đổi với sự giúp đỡ của

git describe --tags --long

Lệnh này cho một cái gì đó như:

7603-3-g7f4610d

Phương tiện: Thẻ cuối cùng là 7603 - đó là bản sửa đổi SVN. 3 - là số lượng cam kết từ nó. Chúng ta cần thêm chúng.

Vì vậy, số sửa đổi có thể được tính theo kịch bản này:

expr $(git describe --tags --long | cut -d '-' -f 1) + $(git describe --tags --long | cut -d '-' -f 2)

1

Cái tôi từng dùng là:

git log | grep "^commit" | wc -l

Đơn giản nhưng nó đã làm việc.


4
phải mất một dòng thông báo cam kết bắt đầu bằng "cam kết" để phá vỡ số lượng. Ví dụ: "đã sửa chữa các lỗi và các bài kiểm tra bị hỏng mà tôi vô tình đẩy vào lần cuối \ ncommit"
Paweł Polewicz

1

Sử dụng cú pháp Bash,

$(git rev-list --count HEAD)

có vẻ tốt cho lịch sử tuyến tính hoàn toàn. Nếu bạn cũng muốn đôi khi có các số điện thoại từ các chi nhánh (dựa trên tắt master), hãy xem xét:

$(git rev-list --count $(git merge-base master HEAD)).$(git rev-list --count ^master HEAD)

Khi chạy từ thanh toán master, bạn nhận được đơn giản 1234.0hoặc tương tự. Khi chạy từ thanh toán của một chi nhánh, bạn sẽ nhận được một cái gì đó như thế 1234.13, nếu đã có 13 cam kết được thực hiện trên chi nhánh đó. Rõ ràng điều này chỉ hữu ích khi bạn chỉ dựa vào nhiều nhất một nhánh trong một masterphiên bản nhất định .

--first-parent có thể được thêm vào số vi mô để loại bỏ một số cam kết chỉ phát sinh từ việc sáp nhập các nhánh khác, mặc dù điều này có thể không cần thiết.


1

Bạn co thể thử

git log --oneline | wc -l

hoặc liệt kê tất cả các cam kết được thực hiện bởi những người đóng góp trong kho lưu trữ

git shortlog -s

1

git config --global alias.count 'rev-list --all --count'

Nếu bạn thêm nó vào cấu hình của bạn, bạn chỉ có thể tham khảo lệnh;

git count


0

Sử dụng git shortlog như thế này

git shortlog -sn

Hoặc tạo bí danh (cho thiết bị đầu cuối dựa trên ZSH)

# show contributors by commits alias gcall="git shortlog -sn"


0

Làm thế nào về việc làm cho một alias?

alias gc="git rev-list --all --count"      #Or whatever name you wish
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.