Bạn có thể lấy số dòng mã từ kho lưu trữ GitHub không?


417

Trong kho lưu trữ GitHub, bạn có thể thấy số liệu thống kê ngôn ngữ Tiếng Đức, hiển thị tỷ lệ phần trăm của dự án được viết bằng ngôn ngữ. Tuy nhiên, nó không hiển thị bao nhiêu dòng mã dự án bao gồm. Thông thường, tôi muốn nhanh chóng có được một ấn tượng về quy mô và độ phức tạp của một dự án và số lượng dòng mã có thể mang lại ấn tượng tốt đầu tiên. 500 dòng mã ngụ ý một dự án tương đối đơn giản, 100.000 dòng mã ngụ ý một dự án rất lớn / phức tạp.

Vì vậy, có thể lấy các dòng mã được viết bằng các ngôn ngữ khác nhau từ kho lưu trữ GitHub, tốt nhất là không nhân bản nó?


Câu hỏi Số lượng dòng trong kho git . Câu hỏi về cách đếm các dòng mã trong kho Git cục bộ, nhưng:

  1. Bạn phải sao chép dự án, có thể rất lớn. Nhân bản một dự án như Wine chẳng hạn, mất nhiều thời gian.
  2. Bạn sẽ đếm các dòng trong các tệp không nhất thiết phải là mã, như các tệp i13n.
  3. Nếu bạn chỉ đếm (ví dụ) các tệp Ruby, bạn có khả năng bỏ lỡ số lượng lớn mã trong các ngôn ngữ khác, như JavaScript. Bạn phải biết trước ngôn ngữ mà dự án sử dụng. Bạn cũng phải lặp lại số lượng cho mọi ngôn ngữ mà dự án sử dụng.

Nói chung, điều này có khả năng quá tốn thời gian cho việc kiểm tra nhanh quy mô của một dự án.


4
@Schwern: Không thực sự nghĩ về điều đó. Cam kết mới nhất của chi nhánh, tôi cho rằng.
Hubro

8
@Abizern: Đó có phải là lý do hợp lệ để đóng câu hỏi không? Tôi đang cố gắng để tìm thấy điều đó trong các hướng dẫn . Kế hoạch của tôi là hỏi về SO trước. Nếu điều đó tỏ ra vô ích, tôi sẽ hỏi bộ phận hỗ trợ khách hàng của Github và đăng thông tin của họ dưới dạng câu trả lời tại đây.
Hubro

7
@Abizern: Xem về chủ đề . Nó nói rằng bạn có thể đặt câu hỏi về "các công cụ phần mềm thường được lập trình viên sử dụng".
Hubro

1
@Hubro 1 Tôi đã giải quyết với git clone --depth 1. Đối với 2 và 3, tôi nghi ngờ có phần mềm ngoài đó có thể phân tích cho bạn và bạn có thể đoán rất nhiều dựa trên các phần mở rộng tệp, nhưng tôi đang có một thời gian tìm kiếm tốt hạn để tìm phần mềm nói. Có lẽ bạn cần phải hỏi một câu hỏi khác.
Schwern

1
Có một công cụ trực tuyến tại codetabs.com/count-loc/count-loc-online.html , chưa thử nếu nó tốt.
Tgr

Câu trả lời:


298

Một kịch bản shell, cloc-git

Bạn có thể sử dụng tập lệnh shell này để đếm số lượng dòng trong kho Git từ xa bằng một lệnh:

#!/usr/bin/env bash
git clone --depth 1 "$1" temp-linecount-repo &&
  printf "('temp-linecount-repo' will be deleted automatically)\n\n\n" &&
  cloc temp-linecount-repo &&
  rm -rf temp-linecount-repo

Cài đặt

Kịch bản này yêu cầu CLOC (Dòng Count Code Code) được cài đặt. cloccó thể có thể được cài đặt với trình quản lý gói của bạn - ví dụ: brew install clocvới Homebrew . Ngoài ra còn có một hình ảnh docker được xuất bản dướimribeiro/cloc .

Bạn có thể cài đặt tập lệnh bằng cách lưu mã của nó vào một tệp cloc-git, đang chạy chmod +x cloc-gitvà sau đó di chuyển tệp vào một thư mục $PATHnhư của bạn /usr/local/bin.

Sử dụng

Kịch bản có một đối số, đó là bất kỳ URL nào git clonesẽ chấp nhận. Ví dụ là https://github.com/evalEmpire/perl5i.git(HTTPS) hoặc git@github.com:evalEmpire/perl5i.git(SSH). Bạn có thể lấy URL này từ bất kỳ trang dự án GitHub nào bằng cách nhấp vào Clone Clone hoặc tải xuống.

Ví dụ đầu ra:

$ cloc-git https://github.com/evalEmpire/perl5i.git
Cloning into 'temp-linecount-repo'...
remote: Counting objects: 200, done.
remote: Compressing objects: 100% (182/182), done.
remote: Total 200 (delta 13), reused 158 (delta 9), pack-reused 0
Receiving objects: 100% (200/200), 296.52 KiB | 110.00 KiB/s, done.
Resolving deltas: 100% (13/13), done.
Checking connectivity... done.
('temp-linecount-repo' will be deleted automatically)


     171 text files.
     166 unique files.                                          
      17 files ignored.

http://cloc.sourceforge.net v 1.62  T=1.13 s (134.1 files/s, 9764.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Perl                           149           2795           1425           6382
JSON                             1              0              0            270
YAML                             2              0              0            198
-------------------------------------------------------------------------------
SUM:                           152           2795           1425           6850
-------------------------------------------------------------------------------

Lựa chọn thay thế

Chạy các lệnh bằng tay

Nếu bạn không muốn lưu và cài đặt tập lệnh shell, bạn có thể chạy các lệnh theo cách thủ công. Một ví dụ:

$ git clone --depth 1 https://github.com/evalEmpire/perl5i.git
$ cloc perl5i
$ rm -rf perl5i

Nhà ngôn ngữ học

Nếu bạn muốn kết quả khớp chính xác với tỷ lệ phần trăm ngôn ngữ của GitHub, bạn có thể thử cài đặt Linguist thay vì CLOC . Theo README của nó , bạn cần phải gem install linguistchạy linguist. Tôi không thể làm cho nó hoạt động ( vấn đề # 2223 ).


6
Các câu hỏi ban đầu được chỉ định mà không nhân bản repo.
linuxdan

12
@linuxdan Kịch bản của tôi không sao chép toàn bộ repo; nó vượt qua --depth 1để chỉ tải về các cam kết gần đây nhất. Đối với hầu hết các repos, điều này tránh được mối quan tâm ban đầu của câu hỏi về việc nhân bản mất quá nhiều thời gian.
Rory O'Kane

2
người đàn ông, điều này làm việc tuyệt vời! luôn tự hỏi, tôi đã mã hóa được bao nhiêu dòng)
Anatoly Yakimchuk

@ RoryO'Kane chúng ta có thể sử dụng clocđể lấy các dòng mã trong kho lưu trữ github mà không cần sao chép repo vào máy của chúng tôi (thông qua trực tuyến). những thứ được đưa ra ở trên cloc-gitcũng được nhân bản đầu tiên vào dự án trước khi bắt đầu đếm số dòng
Kasun Siyambalapitiya

@KasunSiyambalapitiya Xin lỗi, tôi không biết bất kỳ trang web trực tuyến nào clocphù hợp với bạn. Để clocđếm số dòng trong mã, máy tính của bạn phải tải xuống mã đó, mặc dù chỉ là tạm thời. Lưu ý rằng ngay cả các trình duyệt web đang tải xuống kỹ thuật các trang web khi bạn truy cập chúng; họ chỉ lưu chúng vào bộ nhớ thay vì vào đĩa.
Rory O'Kane

226

Bạn có thể chạy một cái gì đó như

git ls-files | xargs wc -l

sẽ cho bạn tổng số →

dòng mã

Hoặc sử dụng công cụ này → http://line-count.herokuapp.com/


8
Câu trả lời ngắn cho câu hỏi (tìm số này bằng github) là Không. Cách tiếp cận của bạn là cách thay thế tốt thứ hai, đặc biệt vì chúng tôi có thể lọc bất kỳ tệp nào chúng tôi cần tính ra.
Bernard

32
Nếu bạn muốn lọc, ví dụ: mã Python : git ls-files | grep '\.py' | xargs wc -l.
Felipe SS Schneider

3
Tôi đang làm xargscho wc -ltất cả các file bằng tay sau đó sử dụng awkđể tổng hợp các cột, OMG này là như vậy dễ dàng hơn nhiều.
sdkks

1
Cách tiếp cận đơn giản này bao gồm các ý kiến ​​trong các tập tin. Nhận xét và dòng trống không phải luôn luôn được coi là "dòng mã".
Mark Stosberg

2
Vâng, tài liệu là một phần rất lớn của mã. Nơi nào bạn sẽ vẽ đường thực sự nếu bạn đưa ra ý kiến. Điều gì về các bình luận có chứa thông tin mã như params, điều gì về các bình luận vô hiệu hóa ESLint cho dòng tiếp theo - thế còn các dòng có 80% bình luận sau một số mã. Xem nơi tôi đang đi với này.
Ahmad Awais

129

Có một tiện ích mở rộng cho trình duyệt Google Chrome - GLOC hoạt động cho các repos công khai và riêng tư.

Đếm số lượng dòng mã của một dự án từ:

  • trang chi tiết dự án
  • kho của người dùng
  • trang tổ chức
  • trang kết quả tìm kiếm
  • trang xu hướng
  • khám phá trang

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


3
được nâng cấp mặc dù nó dường như không hoạt động cho các kho riêng
Michail Michailidis

4
@MichailMichailidis Cảm ơn bạn đã gợi ý. Tôi sẽ sửa chữa nó.
Artem Solovev

4
@Taurus Nhận xét của tôi không có nghĩa là CR - từ quan điểm khả năng sử dụng, gradient thực hiện công việc (vì lý do bạn đề cập) Tôi có nghĩa là tôi không phải là người hâm mộ của các màu được chọn mà chỉ là ý kiến ​​(chủ quan) của tôi. Chúc mừng :)
tech4242

2
@hellyale chắc chắn. trong một vài tuần
Artem Solovev

2
@hellyale Nó cũng hoạt động cho repos tư nhân. Cập nhật mở rộng. Có nhiều tính năng mới hơn để sử dụng
Artem Solovev

70

Nếu bạn đi đến trang biểu đồ / cộng tác viên, bạn có thể thấy danh sách tất cả những người đóng góp cho repo và số lượng dòng họ đã thêm và xóa.

Trừ khi tôi thiếu một cái gì đó, trừ đi tổng số dòng bị xóa khỏi tổng số dòng được thêm vào trong số tất cả những người đóng góp sẽ mang lại tổng số dòng mã trong repo. (EDIT: hóa ra tôi đã thiếu một cái gì đó sau tất cả. Hãy xem nhận xét của orbitbot để biết chi tiết.)

CẬP NHẬT:

Dữ liệu này cũng có sẵn trong API của GitHub . Vì vậy, tôi đã viết một kịch bản nhanh để lấy dữ liệu và thực hiện tính toán:

'use strict';

function countGithub(repo) {
fetch('https://api.github.com/repos/'+repo+'/stats/contributors')
    .then(response => response.json())
    .then(contributors => contributors
        .map(contributor => contributor.weeks
            .reduce((lineCount, week) => lineCount + week.a - week.d, 0)))
    .then(lineCounts => lineCounts.reduce((lineTotal, lineCount) => lineTotal + lineCount))
    .then(lines => window.alert(lines));
}

countGithub('jquery/jquery'); // or count anything you like

Chỉ cần dán nó vào đoạn trích DevTools của Chrome, thay đổi repo và nhấp vào chạy.

Tuyên bố miễn trừ trách nhiệm (nhờ lovasoa ):

Lấy kết quả của phương pháp này bằng một hạt muối, vì đối với một số repos (sorich87 / bootstrap-tour), nó dẫn đến các giá trị âm, điều này có thể cho thấy có gì đó không đúng với dữ liệu được trả về từ API của GitHub.

CẬP NHẬT:

Có vẻ như phương pháp này để tính tổng số dòng không hoàn toàn đáng tin cậy. Hãy xem bình luận của orbitbot để biết chi tiết.


Đúng. Nhưng trong một số trường hợp, dự án là một dự án cộng đồng nguồn mở lớn, loại tính toán này không khả thi.
franklin

@franklin Chắc chắn. Tuy nhiên, dữ liệu này cũng có sẵn trong API của GitHub , vì vậy bạn có thể viết một tập lệnh để tính tổng số dòng khá dễ dàng. Tôi đã cập nhật câu trả lời của mình với một kịch bản nhanh mà tôi vừa viết lên.
Lewis

Sẽ đơn giản hơn khi sử dụng API code_frequecy. Tặng: fetch("https://api.github.com/repos/jquery/jquery/stats/code_frequency").then(x=>x.json()).then(x=>alert(x.reduce((total,changes)=>total+changes[1]+changes[2],0)))
lovasoa

Hmmm ... Thú vị: kiểm tra mã của bạn trên sorich87 / bootstrap-tour. Kết quả là âm tính.
lovasoa

3
@Lewis Tôi nghĩ rằng bạn không quan tâm đến việc các dòng được thêm / xóa trong một lần xác nhận có thể giống như các cam kết khác, khi kết hợp các nhánh, v.v ... vẫn được tính vào cùng một tổng. Ngoài ra, các thống kê đóng góp của Github cho hồ sơ người dùng chỉ được tính từ nhánh hoặc trang gh mặc định, do đó, có thể có điều gì đó tương tự đang xảy ra đối với các thống kê cam kết / dòng: help.github.com/articles/ ,. Cũng lưu ý rằng số liệu thống kê hồ sơ người dùng chỉ tính năm trước, nhưng tôi nghĩ rằng số liệu thống kê cam kết trên trang biểu đồ là vĩnh viễn.
orbitbot

38

Bạn chỉ có thể sao chép cam kết mới nhất bằng cách sử dụng git clone --depth 1 <url>và sau đó thực hiện phân tích của riêng mình bằng Linguist , phần mềm tương tự mà Github sử dụng. Đó là cách duy nhất tôi biết bạn sẽ nhận được các dòng mã.

Một tùy chọn khác là sử dụng API để liệt kê các ngôn ngữ mà dự án sử dụng . Nó không cung cấp cho họ trong dòng nhưng theo byte. Ví dụ...

$ curl https://api.github.com/repos/evalEmpire/perl5i/languages
{
  "Perl": 274835
}

Mặc dù có một hạt muối, dự án đó bao gồm YAML và JSON mà trang web thừa nhận nhưng API thì không.

Cuối cùng, bạn có thể sử dụng tìm kiếm mã để hỏi tập tin nào khớp với ngôn ngữ đã cho. Ví dụ này hỏi tập tin nào trong perl5i là Perl. https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i. Nó sẽ không cung cấp cho bạn các dòng và bạn phải yêu cầu kích thước tệp riêng biệt bằng cách sử dụng trả về urlcho mỗi tệp.


Thật tuyệt, không biết về điều đó. Bạn có thể xác nhận rằng nó không thể được thực hiện trên trang web Github không?
Hubro

Tôi không thể xác nhận điều đó, nhưng tôi không thấy bất cứ điều gì trong API hoặc trên trang web Github sẽ cung cấp cho bạn các dòng. Đó là tất cả các byte hoặc tỷ lệ phần trăm. Lý do của bạn để làm điều đó thông qua API thay vì nhân bản là gì?
Schwern

Ok, cảm ơn cho thông tin mặc dù. Tôi sẽ yêu cầu hỗ trợ của Github.
Hubro

Ngôn ngữ học trông rất tuyệt, nhưng làm thế nào để bạn có được nó để hiển thị cho bạn các dòng mã mặc dù? Dường như nó hiển thị byte theo mặc định, giống như API.
Hubro

@Hubro Dunno, bạn có thể phải vá nó.
Schwern

33

Hiện tại không thể có trên Github.com hoặc API của họ

Tôi đã nói chuyện với bộ phận hỗ trợ khách hàng và xác nhận rằng điều này không thể thực hiện được trên github.com. Họ đã chuyển đề xuất cùng với nhóm Github, vì vậy hy vọng nó sẽ có thể trong tương lai. Nếu vậy, tôi chắc chắn sẽ chỉnh sửa câu trả lời này.

Trong khi đó, câu trả lời của Rory O'Kane là một sự thay thế tuyệt vời dựa trên clocvà một bản sao repo nông.


2
Không trực tiếp, nhưng API thống kê của họ có tất cả dữ liệu bạn cần để tự tính toán. Xem câu trả lời của tôi dưới đây cho một kịch bản nhanh chóng thực hiện điều này.
Lewis

12

Bạn có thể sử dụng API GitHub để lấy sloc như hàm sau

function getSloc(repo, tries) {

    //repo is the repo's path
    if (!repo) {
        return Promise.reject(new Error("No repo provided"));
    }

    //GitHub's API may return an empty object the first time it is accessed
    //We can try several times then stop
    if (tries === 0) {
        return Promise.reject(new Error("Too many tries"));
    }

    let url = "https://api.github.com/repos" + repo + "/stats/code_frequency";

    return fetch(url)
        .then(x => x.json())
        .then(x => x.reduce((total, changes) => total + changes[1] + changes[2], 0))
        .catch(err => getSloc(repo, tries - 1));
}

Cá nhân tôi đã thực hiện một tiện ích mở rộng chrome hiển thị số lượng SLOC trên cả danh sách dự án github và trang chi tiết dự án. Bạn cũng có thể đặt mã thông báo truy cập cá nhân của mình để truy cập vào kho lưu trữ riêng tư và bỏ qua giới hạn tỷ lệ api.

Bạn có thể tải xuống từ đây https://chrom.google.com.vn/webstore/detail/github-sloc/fkjjjamhihnjmihibcmdnianbcbccpnn

Mã nguồn có sẵn ở đây https://github.com/martianyi/github-sloc


Đối với phần mở rộng chrome, SLOC được xác định như thế nào? Tất cả các loại tập tin? Loại trừ các thư mục cụ thể?
Brett Reinhard

@BrettReinhard Dựa trên số lần bổ sung và xóa mỗi tuần , tôi nghĩ rằng nó bao gồm tất cả các tệp.
Yi Kai

Không phải điều đó chỉ trả lại số lượng thay đổi trong tuần trước sao?
Zi 'cá' Ziemke

@ Johannes'fish'Ziemke Không, nó trở lại mỗi tuần
Yi Kai

11

Firefox bổ trợ Github SLOC

Tôi đã viết một addon firefox nhỏ in số dòng mã trên các trang dự án github: Github SLOC


Plugin tuyệt vời, rất hữu ích! Bạn có biết nếu nó có thể làm cho nó hoạt động với repos riêng? Nó dường như chỉ hiển thị LỘC trên repos công cộng.
rococo

Liên kết đã chết và sau khi tìm kiếm thủ công, có vẻ như thật đáng buồn là plugin này không còn tồn tại nữa.
dCSeven

Cũng có yêu cầu cung cấp GLOC cho Firefox và nhà phát triển dường như mở ra ý tưởng: github.com/artem-solovev/gloc/issues/23
miyalys 16/11/19


7

Nếu câu hỏi là "bạn có thể nhanh chóng nhận được SỐ LƯỢNG của một repo github không", thì câu trả lời là không như đã nêu trong các câu trả lời khác.

Tuy nhiên, nếu câu hỏi là "bạn có thể kiểm tra nhanh QUY MÔ của dự án không", tôi thường đánh giá một dự án bằng cách xem xét kích thước của nó. Tất nhiên kích thước sẽ bao gồm các đồng bằng từ tất cả các cam kết hoạt động, nhưng đó là một số liệu tốt vì thứ tự cường độ khá gần.

Ví dụ

Dự án "docker" lớn như thế nào?

Trong trình duyệt của bạn, hãy nhập api.github.com/repose/ORG_NAME/PROJECT_NAME tức là api.github.com/repose/docker/docker

Trong hàm băm phản hồi, bạn có thể tìm thấy thuộc tính kích thước:

{
    ...
    size: 161432,
    ...
}

Điều này sẽ cung cấp cho bạn một ý tưởng về quy mô tương đối của dự án. Con số có vẻ là KB, nhưng khi tôi kiểm tra nó trên máy tính thì nó thực sự nhỏ hơn, mặc dù thứ tự cường độ là nhất quán. (161432KB = 161MB, du -s -h docker = 65MB)


1
npm install sloc -g
git clone --depth 1 https://github.com/vuejs/vue/
sloc ".\vue\src" --format cli-table
rm -rf ".\vue\"

Hướng dẫn và giải thích

  1. Cài đặt sloc từ npm , một công cụ dòng lệnh ( Node.js cần được cài đặt).
npm install sloc -g
  1. Clone kho lưu trữ nông (tải xuống nhanh hơn so với bản sao đầy đủ).
git clone --depth 1 https://github.com/facebook/react/
  1. Chạy sloc và specifiy đường dẫn cần được phân tích.
sloc ".\react\src" --format cli-table

sloc hỗ trợ định dạng đầu ra là a cli-table, as jsonhoặc csv. Biểu thức thông thường có thể được sử dụng để loại trừ các tệp và thư mục ( Thông tin thêm về npm ).

  1. Xóa thư mục kho lưu trữ (tùy chọn)

Powershell: rm -r -force ".\react\"hoặc trên Mac / Unix:rm -rf ".\react\"

Ảnh chụp màn hình của các bước thực hiện (bảng cli):

đầu ra sloc như bảng acli

đầu ra sloc (không có đối số):

đầu ra sloc không có đối số


Điều này dường như không hoạt động đối với các tệp R như .R hoặc .Rmd
jzadra

1

Đặt đầu ra từ số lượng dòng trong mỗi tệp sortđể sắp xếp các tệp theo số dòng. git ls-files | xargs wc -l |sort -n



0

Mở terminal và chạy như sau:

curl https://api.codetabs.com/v1/loc?github=username/reponame
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.