您可以从GitHub存储库中获取代码行数吗?


415

在GitHub存储库中,您可以看到“语言统计信息”,其中显示了用某种语言编写的项目的百分比。但是,它不会显示项目包含多少行代码。通常,我想快速了解一个项目的规模和复杂性,而代码行数可以给人很好的第一印象。500行代码表示一个相对简单的项目,100,000行代码表示一个非常大/复杂的项目。

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


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

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

总而言之,这对于“快速检查项目规模”而言可能太耗时。


4
@Schwern:真的没有考虑过。我猜想master分支的最新提交。
Hubro 2014年

8
@Abizern:那是结束问题的正当理由吗?我正在尝试在指南中找到它。我的计划是先提出要求。如果证明是徒劳的,我将向Github客户支持并在此发布他们的信息作为答案。
Hubro 2014年

7
@Abizern:请参见主题。它说您可以提出有关“程序员常用的软件工具”的问题。
Hubro 2014年

1
@Hubro 1我已经解决了git clone --depth 1。至于2和3,我怀疑那里有可以为您做分析的软件,您可以根据文件扩展名进行很多猜测,但是我很难找一个好的搜索条件术语查找软件。也许您需要问另一个问题。
Schwern 2014年

1
codetabs.com/count-loc/count-loc-online.html上有一个在线工具,还没有尝试过。
Tgr

Answers:


298

一个shell脚本, cloc-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可以与软件包管理器一起安装-例如,brew install clocHomebrew一起安装。在下方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
-------------------------------------------------------------------------------

备择方案

手动运行命令

如果不想麻烦保存和安装Shell脚本,则可以手动运行命令。一个例子:

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

语言学家

如果您希望结果与GitHub的语言百分比完全匹配,可以尝试安装Linguist而不是CLOC。根据其自述文件,您需要先gem install linguist运行linguist。我无法使它正常工作(问题#2223)。


6
指定原始问题而不克隆存储库。
linuxdan

12
@linuxdan我的脚本没有克隆整个仓库;它通过--depth 1仅下载最新的提交。对于大多数存储库,这避免了原始问题所关心的克隆时间过长的问题。
罗里·奥肯

2
男人,这棒极了!一直想知道,我编码了多少行)
Anatoly Yakimchuk '16

我们可以使用@ RoryO'Kane cloc来获取github存储库中的代码行,而无需将存储库克隆到我们的机器上(通过在线方式)。上面给出的cloc-gitaslo第一个克隆要进行计划,然后开始计算行数
Kasun Siyambalapitiya

@KasunSiyambalapitiya对不起,我不知道cloc有为您运行的在线网站。为了cloc计数代码中的行数,您的计算机必须下载该代码,尽管只是暂时的。请注意,即使是网络浏览器,从技术上来说,当您访问它们时也会下载网页。他们只是将它们保存到内存而不是磁盘。
罗里·奥肯

225

您可以运行类似

git ls-files | xargs wc -l

这将给您总数→

代码行

或使用此工具→ http://line-count.herokuapp.com/


8
这个问题的简短答案(使用github查找此数字)是No。您的方法是第二好的选择,特别是因为我们可以过滤掉需要计数的所有文件。
伯纳德

32
如果要过滤,例如Python代码:git ls-files | grep '\.py' | xargs wc -l
Felipe SS Schneider

3
我手动xargswc -l所有文件进行处理,然后使用“ awk求和”列将其加总,天哪,这非常容易。
sdkks '18 -10-1,3

1
这种简单的方法包括文件中的注释。注释和空白行并不总是被视为“代码行”。
马克·斯托斯伯格

2
好吧,文档是代码的很大一部分。如果您发表评论,那么您实际上将在哪里划界线。包含参数信息(例如params)的注释该怎么办?禁用下一行ESLint的注释该怎么办?有关在某些代码后占80%注释的行呢?看看我要去哪里。
艾哈迈德·阿威斯

128

有延期谷歌Chrome浏览器 - GLOC这适用于公共和私人回购协议。

计算来自以下项目的代码行数:

  • 项目详细信息页面
  • 用户的资料库
  • 组织页面
  • 搜索结果页面
  • 趋势页面
  • 探索页面

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明


3
投票赞成,尽管它似乎不适用于私人仓库
Michail Michailidis

4
@MichailMichailidis谢谢您的建议。我会解决的。
Artem Solovev

4
@Taurus我的评论不是CR的意思-从可用性的角度来看,渐变确实起作用(由于您提到的原因),我的意思是我不喜欢所选颜色,而是我的(主观)观点。干杯:)
tech4242 '17

2
@hellyale当然。几周后
Artem Solovev

2
@hellyale它也适用于私人仓库。更新扩展名。还有更多新功能要使用
Artem Solovev

70

如果转到“图表/贡献者”页面,则可以看到回购所有贡献者的列表,以及他们添加和删除了多少行。

除非我丢失了某些内容,否则从所有贡献者之间添加的总行数中减去已删除的总行数,将得出回购中代码的总行数。(编辑:事实证明我毕竟还缺少什么。请查看orbitbot的评论以获取详细信息。)

更新:

GitHub的API中也提供了这些数据。因此,我编写了一个快速脚本来获取数据并进行计算:

'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

只需将其粘贴到Chrome DevTools代码段中,更改存储库,然后单击运行即可。

免责声明(感谢lovasoa):

用这种方法的结果来说明一下,因为对于某些回购协议(sorich87 / bootstrap-tour),它会导致负值,这可能表明GitHub API返回的数据有问题。

更新:

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


对。但是在某些项目是大型开源社区项目的情况下,这种计数是不可行的。
富兰克林

@franklin一定。但是,此数据在GitHub的API中也可用,因此您可以编写脚本来轻松计算行总数。我用刚写的快速脚本更新了答案。
刘易斯

使用code_frequecy API会更简单。给予: 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

嗯...有趣:在sorich87 / bootstrap-tour上测试您的代码。结果为负数。
lovasoa

3
@Lewis我认为您无视一个提交中添加/删除的行可以与其他提交相同,例如合并分支等时仍保持相同的总数。此外,仅从默认分支或gh-pages计算用户配置文件的Github贡献统计信息,因此对于commit / line stats可能会有类似的情况:help.github.com/articles/…。另请注意,用户个人资料统计仅统计上一年的数据,但我认为图表页面上的提交统计数据是永久的。
orbitbot

38

您可以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+repo:evalEmpire/perl5i。它不会给您任何内容,您必须使用url每个文件的返回值分别询问文件大小。


酷,对此一无所知。但是,您可以确认无法在Github网站上完成此操作吗?
Hubro 2014年

我无法确认,但是我在API或Github网站上看不到任何内容。全部是字节或百分比。通过API而不是克隆进行此操作的理由是什么?
Schwern 2014年

好的,虽然谢谢您的信息。我会向Github寻求支持。
Hubro 2014年

语言学家看起来很酷,但是如何获得它来显示代码呢?就像API一样,它看起来默认显示字节。
Hubro 2014年

@Hubro Dunno,您可能需要修补它。
Schwern 2014年

33

目前无法在Github.com或其API-s上使用

我已与客户支持部门联系,并确认无法在github.com上完成此操作。他们已经将建议传递给了Github团队,因此希望将来有可能。如果是这样,我将确保编辑此答案。

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


2
不是直接的,但是他们的Statistics API具有您自己计算所需的所有数据。请参阅以下我的答案以获取执行此操作的快速脚本。
刘易斯

12

您可以使用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


对于chrome扩展,如何确定SLOC?所有文件类型?排除特定目录?
Brett Reinhard

@BrettReinhard这是基于每周添加和删除的次数,我认为它包括所有文件。
怡凯

这不只是返回上周的更改数量吗?
Johannes'fish'Ziemke '17

@ Johannes'fish'Ziemke不,每星期返回
怡凯

11

Firefox附件Github SLOC

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


很棒的插件,非常有帮助!您知道是否可以使其与私人回购协议一起使用吗?它似乎仅在公共回购中显示LOC。
rococo

该链接已消失,在手动搜索后,似乎该插件不再存在。
dCS19年

有人要求将GLOC也可用于Firefox,并且开发人员似乎对此
miyalys


7

如果问题是“您能否快速获得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)


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

说明和解释

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

sloc支持将输出格式化为a cli-table,as jsoncsv。正则表达式可用于排除文件和文件夹(有关更多信息,请参见npm)。

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

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

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

sloc输出作为acli-table

sloc输出(无参数):

sloc输出不带参数


这似乎不适用于.R或.Rmd之类的R文件
jzadra

1

用管道传输每个文件中sort的行数输出,以按行数组织文件。 git ls-files | xargs wc -l |sort -n



0

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

curl https://api.codetabs.com/v1/loc?github=username/reponame
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.