Đếm số lượng dòng trong kho git


766

Làm cách nào để tôi đếm tổng số dòng có trong tất cả các tệp trong kho git?

git ls-files cho tôi một danh sách các tập tin được theo dõi bởi git.

Tôi đang tìm kiếm một lệnh cho cattất cả các tập tin. Cái gì đó như

git ls-files | [cat all these files] | wc -l

Câu trả lời:


1140

xargs sẽ làm những gì bạn muốn:

git ls-files | xargs cat | wc -l

Nhưng với nhiều thông tin hơn và có thể tốt hơn, bạn có thể làm:

git ls-files | xargs wc -l

11
Tôi đoán tầm thường; Làm thế nào về chỉ bao gồm các tệp mã nguồn (ví dụ * .cpp). Chúng tôi có một số tệp bin đã cam kết :)
Daniel

39
Dán grep cpp |ở đó trước xargs, sau đó.
Carl Norum

35
Sử dụng git ls-files -z | xargs -0 wc -lnếu bạn có tệp có khoảng trắng trong tên.
mpontillo

34
Để bao gồm / không bao gồm các tệp nhất định sử dụng: git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -ltrong đó phần grep là bất kỳ biểu thức chính quy nào bạn muốn!
Gabriel

29
Nếu bạn quan tâm đến chỉ các tệp .java bạn có thể sử dụnggit ls-files | grep "\.java$" | xargs wc -l
dseibert

352
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Điều này cho thấy sự khác biệt từ cây trống đến cây làm việc hiện tại của bạn. Điều này xảy ra để đếm tất cả các dòng trong cây làm việc hiện tại của bạn.

Để lấy số trong cây làm việc hiện tại của bạn, hãy làm điều này:

git diff --shortstat `git hash-object -t tree /dev/null`

Nó sẽ cung cấp cho bạn một chuỗi như 1770 files changed, 166776 insertions(+).


45
BTW, bạn có thể lấy băm đó bằng cách chạy git hash-object -t tree /dev/null.
ephemient

84
Và thậm chí ngắn gọn hơn:git diff --stat `git hash-object -t tree /dev/null`
rpetrich

10
Đây là giải pháp tốt hơn vì điều này không tính các tệp nhị phân như tài liệu lưu trữ hoặc hình ảnh được tính trong phiên bản trên!
BrainStone

31
+1 Tôi thích giải pháp này tốt hơn vì nhị phân không được tính. Ngoài ra, chúng tôi thực sự chỉ quan tâm đến dòng cuối cùng của đầu ra git diff:git diff --stat `git hash-object -t tree /dev/null` | tail -1
Gabriele Petronella

31
thay vì sử dụng git diff --shortstat `git hash-object -t tree /dev/null` để có được dòng cuối cùng, đuôi là không cần thiết.
Jim Wolff

316

Nếu bạn muốn số này vì bạn muốn có ý tưởng về phạm vi của dự án, bạn có thể thích đầu ra của CLOC (Dòng Count Code Code Code), cung cấp cho bạn phân tích các dòng mã quan trọng và không đáng kể theo ngôn ngữ.

cloc $(git ls-files)

(Dòng này tương đương với git ls-files | xargs cloc. Nó sử dụng sh's $()thay thế lệnh tính năng.)

Đầu ra mẫu:

      20 text files.
      20 unique files.                              
       6 files ignored.

http://cloc.sourceforge.net v 1.62  T=0.22 s (62.5 files/s, 2771.2 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Javascript                       2             13            111            309
JSON                             3              0              0             58
HTML                             2              7             12             50
Handlebars                       2              0              0             37
CoffeeScript                     4              1              4             12
SASS                             1              1              1              5
-------------------------------------------------------------------------------
SUM:                            14             22            128            471
-------------------------------------------------------------------------------

Bạn sẽ phải cài đặt CLOC trước. Bạn có thể có thể cài đặt clocvới trình quản lý gói của mình - ví dụ: brew install clocvới Homebrew .

cloc $(git ls-files)thường là một cải tiến hơn cloc .. Ví dụ, đầu ra mẫu ở trên với git ls-filesbáo cáo 471 dòng mã. Đối với cùng một dự án, cloc .báo cáo một số lượng lớn 456.279 dòng (và mất sáu phút để chạy), vì nó tìm kiếm các phụ thuộc trong node_modulesthư mục bỏ qua Git .


4
CLOC bỏ qua một số ngôn ngữ, chẳng hạn như TypeScript.
Marcelo Camargo

6
@MarceloCamargo tại thời điểm này TypeScript được hỗ trợ
Alexander

1
Đối với người mới bắt đầu, tốt hơn nên thực hiện "cloc DIRECTORY_WHERE_YOUR_GIT_IN" để tính toán các dòng.
Shi

Mô tả đầy đủ có tại đây: github.com/AlDanial/cloc và các tệp nhị phân ở đây: github.com/AlDanial/cloc/release/tag/v1,70
Peter Szanto

15
Bạn chỉ có thể sử dụng cloc --vcs gitnhững ngày này, trong đó tránh một số trường hợp cạnh với các tệp có tên xấu (hoặc quá nhiều trong số chúng).
seanf

56

Tôi đã gặp phải sự cố hàng loạt git ls-files | xargs wc -lkhi xử lý số lượng lớn tệp, trong đó số lượng dòng sẽ được chia thành nhiều totaldòng.

Lấy một mẹo từ câu hỏi Tại sao tiện ích wc tạo ra nhiều dòng với "tổng"? , Tôi đã tìm thấy lệnh sau để bỏ qua vấn đề:

wc -l $(git ls-files)

Hoặc nếu bạn chỉ muốn kiểm tra một số tệp, ví dụ mã:

wc -l $(git ls-files | grep '.*\.cs')


Điều này thật tuyệt nhưng dường như thất bại đối với các đường dẫn chứa khoảng trắng. Có cách nào để giải quyết điều đó?
Lea Hayes

1
Gặp sự cố với grep '. * \. M' khi chọn các tệp nhị phân như .mp3, .mp4. Đã thành công hơn với việc sử dụng lệnh find để liệt kê các tệp mãwc -l $(git ls-files | find *.m *.h)
Tico Ballagas

3
@LeaHayes đây là một cách : wc -l --files0-from=<(git ls-files -z). Các <(COMMAND)cú pháp trả về tên của một tập tin có nội dung là kết quả của COMMAND.
buck

@buck Cảm ơn, nhưng tôi gặp lỗi khi thử lệnh đó 'không thể tạo đường ống để thay thế quy trình: Chức năng không được triển khai wc: tùy chọn không được nhận dạng --files0-from ='. Có ý kiến ​​gì không?
Lea Hayes

1
@LeaHayes Tôi đã đưa ra kịch bản này mà tôi nghĩ sẽ phù hợp với bạn: `` `#! / Bin / bash results = $ (git ls-files | xargs -d '\ n' wc -l) let grand_total = 0 for x tính bằng $ (echo "$ results" | egrep '[[: chữ số:]] + tổng $'); do let grand_total + = $ (echo "$ x" | awk '{print $ 1}') đã thực hiện echo "$ {results}" echo "grand Total: $ {grand_total}" `` `
buck

45

Đối với tôi, giải pháp tốt nhất, được chôn vùi trong các bình luận về câu trả lời của @ ephemient. Tôi chỉ kéo nó lên đây để nó không bị chú ý. Tín dụng cho việc này sẽ được chuyển đến @FRoZeN (và @ephemient).

git diff --shortstat `git hash-object -t tree /dev/null`

trả về tổng số tệp và dòng trong thư mục làm việc của repo mà không có bất kỳ tiếng ồn bổ sung nào. Là một phần thưởng, chỉ có mã nguồn được tính - các tệp nhị phân được loại trừ khỏi kiểm đếm.

Lệnh trên hoạt động trên Linux và OS X. Phiên bản đa nền tảng của nó là

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Điều đó cũng hoạt động trên Windows.

Đối với bản ghi, các tùy chọn để loại trừ các dòng trống,

  • -w/ --ignore-all-space,
  • -b/ --ignore-space-change,
  • --ignore-blank-lines,
  • --ignore-space-at-eol

Không có bất kỳ tác dụng khi sử dụng với --shortstat. Dòng trống được tính.


1
git mktree </dev/nullhay true|git mktreehay git mktree <&-hay :|git mktreecho các tổ hợp phím-quầy giữa chúng ta :-) - một cây trống tùng nổi xung quanh repo sẽ không bất cứ điều gì tổn thương.
tháng năm

2
Đối với những người thắc mắc rằng băm ra khỏi màu xanh là gì: stackoverflow.com/questions/9765453/ (
Tejas Kale

19

Cái này hoạt động như cloc 1.68:

cloc --vcs=git


--vcskhông làm việc cho tôi, có lẽ nó đã được gỡ bỏ. cloc .trong khi tại git repo đã làm việc, OTOH.
acdcjunior

13

Tôi đã chơi xung quanh với cmder ( http://gooseberrycreative.com/cmder/ ) và tôi muốn đếm các dòng html, css, java và javascript. Trong khi một số câu trả lời ở trên có hiệu quả, ormẫu trong grep không có - tôi đã tìm thấy ở đây ( /unix/37313/how-do-i-grep-for-multipl-potypes ) mà tôi đã có để thoát khỏi nó

Vì vậy, đây là những gì tôi sử dụng bây giờ:

git ls-files | grep "\(.html\|.css\|.js\|.java\)$" | xargs wc -l


2
Điều này dường như để đáp ứng với chunk cho tôi. Sử dụng grep của bạn kết hợp với giải pháp của Justin Aquadro mang lại kết quả tốt cho tôi. wc -l $ (git ls-files | grep "\ (. html \ | .css \ | .js \ | .php \ | .json \ | .sh \) $")
Peter Mark

9

Tôi sử dụng như sau:

git grep ^ | wc -l

Điều này tìm kiếm tất cả các tệp được git cho regex ^, biểu thị phần đầu của một dòng, vì vậy lệnh này cho tổng số dòng!


3

Tôi đã làm điều này:

git ls-files | xargs file | grep "ASCII" | cut -d : -f 1 | xargs wc -l

điều này hoạt động nếu bạn tính tất cả các tệp văn bản trong kho lưu trữ là các tệp quan tâm. Nếu một số được coi là tài liệu, vv, một bộ lọc loại trừ có thể được thêm vào.


3

Công cụ này trên github https://github.com/flosse/sloc có thể cung cấp đầu ra theo cách mô tả hơn. Nó sẽ tạo số liệu thống kê về mã nguồn của bạn:

  • dòng vật lý
  • dòng mã (nguồn)
  • dòng có ý kiến
  • bình luận một dòng
  • dòng có bình luận khối
  • dòng trộn lẫn với nguồn và ý kiến
  • dòng trống

1

Thử:

find . -type f -name '*.*' -exec wc -l {} + 

trên thư mục / thư mục trong câu hỏi


0
: | git mktree | git diff --shortstat --stdin

Hoặc là:

git ls-tree @ | sed '1i\\' | git mktree --batch | xargs | git diff-tree --shortstat --stdin

0

Tùy thuộc vào việc bạn có muốn bao gồm các tệp nhị phân hay không, có hai giải pháp.

  1. git grep --cached -al '' | xargs -P 4 cat | wc -l
  2. git grep --cached -Il '' | xargs -P 4 cat | wc -l

    "xargs -P 4" có nghĩa là nó có thể đọc các tệp bằng bốn quy trình song song. Điều này có thể thực sự hữu ích nếu bạn đang quét các kho rất lớn. Tùy thuộc vào công suất của máy, bạn có thể tăng số lượng quy trình.

    -a, xử lý tệp nhị phân dưới dạng văn bản (Bao gồm nhị phân)
    -l '', chỉ hiển thị tên tệp thay vì khớp dòng (Chỉ quét các tệp không trống)
    -I, không khớp các mẫu trong tệp nhị phân (Loại trừ nhị phân)
    --cached, tìm kiếm trong chỉ mục thay vì trong cây công việc (Bao gồm các tệp không được cam kết)

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.