你能从GitHub存储库中获取代码行数吗?

在GitHub仓库中你可以看到“语言统计”,它显示了该项目用哪种语言编写的项目的百分比,但是它并没有显示该项目由多少行代码组成。通常,我想快速地了解一个项目的规模和复杂性,并且代码行数可以给人一个良好的第一印象。500行代码意味着一个相对简单的项目,100,000行代码意味着一个非常大/复杂的项目。

那么,是否有可能从GitHub存储库中获取以各种语言编写的代码行,最好不要克隆它?


问题“计算git存储库中的行数”询问如何计算本地Git存储库中的代码行,但是:

  1. 您必须克隆项目,这可能是巨大的。例如,克隆像Wine这样的项目需要很长时间。
  2. 您会计算不一定是代码的文件中的行,例如i13n文件。
  3. 如果你计算只是(例如)Ruby文件,你可能会错过大量其他语言的代码,比如JavaScript。你必须事先知道项目使用的语言。你还必须重复项目使用的每种语言的计数。

总而言之,这对于“快速检查项目规模”来说可能过于耗费时间。

572127 次浏览

您可以使用git clone --depth 1 <url>克隆最新的提交,然后使用GitHub使用的相同软件语言学家执行您自己的分析。这是我知道您将获得线代码的唯一方法。

另一种选择是使用API列出项目使用的语言。它不是以行而是以字节的形式给出它们。例如…

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

尽管带着一粒盐,那个项目包括网站认可的YAML和JSON但API没有。

最后,您可以使用代码搜索询问哪些文件与给定语言匹配。此示例询问perl5i中的哪些文件是Perl。https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i。它不会给你行,您必须使用每个文件返回的url单独询问文件大小。

目前在Github.com或其API上不可用

我已经和客户支持谈过了,并确认这不能在github.com.他们已经把这个建议传递给了Github团队,所以希望这在未来是可能的。如果是这样,我一定会编辑这个答案。

同时,Rory O'Kane的回答是基于cloc和浅层仓库克隆的出色替代方案。

外壳脚本cloc-git

您可以使用此外壳脚本通过一个命令来计算远程Git存储库中的行数:

#!/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

安装

此脚本需要安装CLOC(“计数代码行”)。cloc可能可以与您的包管理器一起安装-例如,brew install cloc自制。还有mribeiro/cloc下发布的docker映像

您可以通过将其代码保存到文件cloc-git,运行chmod +x cloc-git,然后将文件移动到$PATH中的文件夹(例如/usr/local/bin)来安装脚本。

用法

该脚本接受一个参数,这是git clone将接受的任何URL。示例是https://github.com/evalEmpire/perl5i.git(HTTPS)或git@github.com:evalEmpire/perl5i.git(SSH)。您可以通过单击“克隆或下载”从任何GitHub项目页面获取此URL。

输出示例:

$ 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
-------------------------------------------------------------------------------

替代品

手动运行命令

如果您不想费心保存和安装外壳脚本,您可以手动运行命令。一个例子:

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

语言学家

如果你想让结果与GitHub的语言百分比完全匹配,你可以尝试安装语言学家而不是CLOC。根据其自述文件,你需要gem install linguist,然后运行linguist。我无法让它工作(问题#2223)。

如果问题是“你能迅速获取github存储库的行数吗”,那么答案是否定的。

然而,如果问题是“你能迅速检查项目的规模吗”,我通常通过查看项目的大小来衡量项目。当然,大小将包括来自所有活动提交的增量,但这是一个很好的度量标准,因为数量级非常接近。

例如。

“Docker”项目有多大?

在浏览器中输入api.github.com/repos/ORG_NAME/PROJECT_NAME api.github.com/repos/docker/docker

在响应哈希中,您可以找到size属性:

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

这应该让您了解项目的相对规模。这个数字似乎以KB为单位,但当我在计算机上检查它时,它实际上更小,即使数量级是一致的。(161432KB=161MB, du-s-h docker=65MB)

如果您转到图/贡献者页面,您可以看到存储库的所有贡献者的列表以及他们添加和删除了多少行。

除非我遗漏了什么,否则从所有贡献者中添加的总行数中减去删除的总行数应该会得到存储库中的代码总行数。(编辑:事实证明我还是遗漏了一些东西。查看orbitbot的评论了解详细信息。)

更新:

这些数据也可以在GitHub的api中找到。所以我写了一个快速脚本来获取数据并进行计算:

'use strict';


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


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

只需将其粘贴到ChromeDevTools片段中,更改存储库并单击运行。

免责声明(感谢洛瓦索):

对这个方法的结果持保留态度,因为对于某些repos(sorich87/bootstrap-Tour),它会导致负值,这可能表明从GitHub的API返回的数据有问题。

更新:

看起来这种计算总行数的方法并不完全可靠。请查看orbitbot的评论了解详细信息。

Firefox插件Github SLOC

我写了一个小的Firefox插件,打印github项目页面上的代码行数:Github SLOC

我为GoogleChrome浏览器-GLOC创建了一个扩展,它适用于公共和私有存储库。

从以下位置计算项目的代码行数:

  • 项目详情页
  • 用户仓库
  • 组织页面
  • 搜索结果页面
  • 热点页
  • 探索页

输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 输入图片描述

您可以使用GitHub API像下面的函数一样获取slc

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));
}

就个人而言,我做了一个chrome扩展,它在github项目列表和项目详细信息页面上都显示了SLOC的数量。您还可以设置您的个人访问令牌来访问私有存储库并绕过api速率限制。

您可以从这里下载https://chrome.google.com/webstore/detail/github-sloc/fkjjjamhihnjmihibcmdnianbcbccpnn

源代码可在此处获得https://github.com/martianyi/github-sloc

你可以运行类似

git ls-files | xargs wc -l

这将为您提供总数→

代码行

您还可以添加更多说明。就像只是查看JavaScript文件一样。

git ls-files | grep '\.js' | xargs wc -l

或者使用这个方便的小工具→https://line-count.herokuapp.com/

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

说明和解释

  1. 从npm安装slc,一个命令行工具(需要安装Node.js)。
npm install sloc -g
  1. 克隆浅层存储库(比完整克隆更快的下载)。
git clone --depth 1 https://github.com/facebook/react/
  1. 跑吧并指定应该分析的路径。
sloc ".\react\src" --format cli-table

SLOC支持将输出格式化为cli-tablejsoncsv。正则表达式可用于排除文件和文件夹(关于npm的更多信息)。

  1. 删除存储库文件夹(可选)

Powershell:rm -r -force ".\react\"或在Mac/Unix上:rm -rf ".\react\"

执行步骤的屏幕截图(cli-table):

作为acli-table输出的slc

slc输出(无参数):

不带参数的输出

也可以使用--details选项获取每个文件的详细信息:

sloc ".\react\src" --format cli-table --details

将每个文件中的行数输出到sort以按行数组织文件。 git ls-files | xargs wc -l |sort -n

从@Tgr的评论中,有一个在线工具: https://codetabs.com/count-loc/count-loc-online.html

strimzi/strimzi-kafka操作符存储库的LOC计数示例

打开终端并运行以下命令:

curl -L "https://api.codetabs.com/v1/loc?github=username/reponame"

在另一个在线工具中,可以计算公共和私有存储库的代码行,而无需克隆/下载它们-https://klock.herokuapp.com/

截图

嘿,这一切都非常简单…

  1. 从您的第一次提交创建一个新分支
  2. 当你想知道你的统计数据时,从main创建一个新的PR
  3. PR将向您显示更改的行数-当您从第一次提交开始进行PR时,您的所有代码都将被计为新行

额外的好处是,如果您不批准PR并将其留在原地,则统计数据(提交数,更改的文件和代码总行数)将在您将更改合并到main时保持最新。

在此处输入图片描述

您可以使用东京

cargo install tokei
git clone --depth 1 https://github.com/XAMPPRocky/tokei
tokei tokei/

输出:

===============================================================================
Language            Files        Lines         Code     Comments       Blanks
===============================================================================
BASH                    4           48           30           10            8
JSON                    1         1430         1430            0            0
Shell                   1           49           38            1           10
TOML                    2           78           65            4            9
-------------------------------------------------------------------------------
Markdown                4         1410            0         1121          289
|- JSON                 1           41           41            0            0
|- Rust                 1           47           38            5            4
|- Shell                1           19           16            0            3
(Total)                           1517           95         1126          296
-------------------------------------------------------------------------------
Rust                   19         3750         3123          119          508
|- Markdown            12          358            5          302           51
(Total)                           4108         3128          421          559
===============================================================================
Total                  31         6765         4686         1255          824
===============================================================================

Tokei支持徽章:

计数线

[![](https://tokei.rs/b1/github/XAMPPRocky/tokei)](https://github.com/XAMPPRocky/tokei)

默认情况下,徽章将显示存储库的LoC(代码行),您也可以通过使用?类别=查询字符串为其指定显示不同的类别。它可以是代码、空白、文件、行、注释。

计数文件

[![](https://tokei.rs/b1/github/XAMPPRocky/tokei?category=files)](https://github.com/XAMPPRocky/tokei)

如果您使用的是Vscode并首先克隆项目,这很容易。只需安装Lines of Code (LOC) Vscode扩展,然后从命令Pallete运行LineCount: Count Workspace Files

该扩展按文件类型显示汇总统计信息,还按每个文件夹输出带有详细信息的结果文件。

这里的答案都没有满足我的要求。我只想使用现有的实用程序。以下脚本将使用基本实用程序:

  • git
  • GNU或BSD awk
  • GNU或BSD se
  • Bash

获取添加到存储库的总行(从添加的行中减去删除的行)。

#!/bin/bash
git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD | \
sed 's/[^0-9,]*//g' | \
awk -F, '!($2 > 0) {$2="0"};!($3 > 0) {$3="0"}; {print $2-$3}'

获取按已知源代码的指定文件类型过滤的代码行(例如*.py文件或添加更多扩展名等)。

#!/bin/bash
git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD -- *.{py,java,js} | \
sed 's/[^0-9,]*//g' | \
awk -F, '!($2 > 0) {$2="0"};!($3 > 0) {$3="0"}; {print $2-$3}'

4b825dc642cb6eb9a060e54bf8d69288fbee4904是Git中“空树”的ID,它始终在每个存储库中可用。

来源:

shields.io有一个徽章,可以为您计算所有行这里。这是一个计算Raycast扩展存储库的示例:

https://img.shields.io/tokei/lines/github/raycast/extensions

我专门为这种用法制作了一个NPM包,它允许您调用CLI工具并提供目录路径和要忽略的文件夹/文件

它是这样的:

npm i -g @quasimodo147/countlines

在您的终端中获取$ countlines命令

你可以这样做 countlines . node_modules build dist

您可以使用开源代码搜索引擎Source cegraph。它可以连接到您的GitHub帐户,索引内容,然后在管理部分您会看到索引的代码行数。输入图片描述