在GitHub存储库中,你可以看到“语言统计”,它显示了用某种语言编写的项目的百分比。但是,它不显示项目由多少行代码组成。通常,我想快速了解项目的规模和复杂性,而代码行数可以给人留下良好的第一印象。500行代码意味着一个相对简单的项目,10万行代码意味着一个非常大/复杂的项目。
那么,是否有可能从GitHub存储库中获得以各种语言编写的代码行,最好不克隆它?
“计算git存储库中的行数”问题询问如何计算本地git存储库中的代码行数,但是:
你必须克隆这个项目,这可能是巨大的。例如,克隆Wine这样的项目需要很长时间。
你可以计算文件中不一定是代码的行数,比如i13n文件。
如果您只计算(例如)Ruby文件,那么您可能会错过大量其他语言的代码,比如JavaScript。您必须事先知道项目使用哪些语言。您还必须为项目使用的每种语言重复计数。
总而言之,这对于“快速检查项目规模”来说可能太费时了。
你可以使用git clone—depth 1 <url>克隆最新的提交,然后使用Github使用的相同软件Linguist执行自己的分析。这是我知道你能得到代码行数的唯一方法。
另一种选择是使用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 +回购:evalEmpire / perl5i。它不会为您提供行,您必须使用每个文件返回的url分别询问文件大小。
shell脚本,clock -git
你可以使用这个shell脚本用一个命令来计算远程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可能可以安装在你的包管理器中——例如,用Homebrew安装cloc。在mribeiro/cloc下还发布了一个docker图像。
您可以通过将脚本代码保存到文件clock -git中,运行chmod +x clock -git,然后将文件移动到$PATH中的文件夹,例如/usr/local/bin,来安装脚本。
使用
该脚本接受一个参数,即git克隆将接受的任何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
-------------------------------------------------------------------------------
选择
手动运行命令
如果不想保存和安装shell脚本,可以手动运行这些命令。一个例子:
$ git clone --depth 1 https://github.com/evalEmpire/perl5i.git
$ cloc perl5i
$ rm -rf perl5i
语言学家
如果你想让结果与GitHub的语言百分比完全匹配,你可以尝试安装Linguist而不是CLOC。根据它的README,你需要gem安装linguist,然后运行linguist。我不能让它工作(第2223期)。
如果问题是“你能否快速获得一个github回购的行数”,答案是否定的,正如其他答案所述。
然而,如果问题是“你能否快速检查项目的规模”,我通常会通过查看项目的规模来评估项目。当然,大小将包括来自所有活动提交的增量,但它是一个很好的度量,因为数量级非常接近。
E.g.
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)
如果您转到图表/贡献者页面,您可以看到回购的所有贡献者的列表,以及他们添加和删除了多少行。
除非我遗漏了什么,否则从所有贡献者中添加的总行数中减去删除的总行数应该得到repo中代码的总行数。(编辑:事实证明,我还是错过了一些东西。详情请看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
只需将其粘贴到Chrome DevTools代码片段中,更改repo并单击运行。
免责声明(感谢lovasoa):
对这种方法的结果持保留态度,因为对于一些回购(sorich87/bootstrap-tour),它的结果是负值,这可能表明从GitHub的API返回的数据有问题。
更新:
看起来这种计算总行数的方法并不完全可靠。详情请看orbitbot的评论。
你可以使用GitHub API像下面的函数一样获得sloc
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
npm install sloc -g
git clone --depth 1 https://github.com/vuejs/vue/
sloc ".\vue\src" --format cli-table
rm -rf ".\vue\"
说明及说明
从npm安装sloc,一个命令行工具(需要安装Node.js)。
npm install sloc -g
克隆浅库(下载速度比完整克隆快)。
git clone --depth 1 https://github.com/facebook/react/
运行sloc并指定要分析的路径。
sloc ".\react\src" --format cli-table
Sloc支持将输出格式化为cli-table、json或csv。正则表达式可以用来排除文件和文件夹(更多关于npm的信息)。
删除存储库文件夹(可选)
Powershell: rm -r -force "。\react\"或Mac/Unix: rm -rf ".\react\"
执行步骤的截图(cli-table):
Sloc输出(无参数):
使用——details选项也可以获取每个文件的详细信息:
sloc ".\react\src" --format cli-table --details
你可以使用tokei:
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(代码行),您也可以指定为它显示一个不同的类别,通过使用?category=查询字符串。它可以是代码、空格、文件、行、注释。
计算文件
[![](https://tokei.rs/b1/github/XAMPPRocky/tokei?category=files)](https://github.com/XAMPPRocky/tokei)
这里的答案没有一个符合我的要求。我只想使用现有的实用程序。下面的脚本将使用基本的实用程序:
Git
GNU或BSD awk
GNU或BSD sed
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,它在每个存储库中始终可用。
来源:
我自己的脚本
如何获得Git差异的第一次提交?
有没有办法让git显示行增加,行改变和行删除?