Pouvez-vous obtenir le nombre de lignes de code d'un référentiel GitHub?

419

Dans un référentiel GitHub, vous pouvez voir des «statistiques linguistiques», qui affichent le pourcentage du projet qui est écrit dans une langue. Cependant, il n'affiche pas le nombre de lignes de code du projet. Souvent, je veux rapidement me faire une idée de l'échelle et de la complexité d'un projet, et le nombre de lignes de code peut donner une bonne première impression. 500 lignes de code impliquent un projet relativement simple, 100 000 lignes de code impliquent un projet très volumineux / compliqué.

Alors, est-il possible d'obtenir les lignes de code écrites dans les différents langages à partir d'un référentiel GitHub, de préférence sans le cloner?


La question « Compter le nombre de lignes dans un référentiel git » demande comment compter les lignes de code dans un référentiel Git local, mais:

  1. Vous devez cloner le projet, ce qui pourrait être énorme. Le clonage d'un projet comme Wine, par exemple, prend des années.
  2. Vous compteriez des lignes dans des fichiers qui ne seraient pas nécessairement du code, comme les fichiers i13n.
  3. Si vous ne comptez que (par exemple) les fichiers Ruby, vous risquez de manquer une énorme quantité de code dans d'autres langues, comme JavaScript. Il faudrait savoir à l'avance quelles langues le projet utilise. Vous devrez également répéter le décompte pour chaque langue utilisée par le projet.

Dans l'ensemble, cela est potentiellement beaucoup trop de temps pour «vérifier rapidement l'échelle d'un projet».

Hubro
la source
4
@Schwern: Je n'y ai pas vraiment pensé. Le dernier commit de la branche master, je suppose.
Hubro
8
@Abizern: Est-ce une raison valable pour fermer une question? J'essaie de trouver cela dans les lignes directrices . Mon plan était de demander d'abord à SO. Si cela s'avérait inutile, je demanderais au support client de Github et posterais leurs informations comme réponse ici.
Hubro
7
@Abizern: Voir sur le sujet . Il indique que vous pouvez poser des questions sur les "outils logiciels couramment utilisés par les programmeurs".
Hubro
1
@Hubro 1 que j'ai résolu git clone --depth 1. En ce qui concerne 2 et 3, je soupçonne qu'il existe un logiciel qui peut faire l'analyse pour vous, et vous pouvez faire beaucoup de suppositions en fonction des extensions de fichier, mais j'ai beaucoup de temps à trouver une bonne recherche terme pour trouver ledit logiciel. Vous devrez peut-être poser une autre question.
Schwern
1
Il y a un outil en ligne sur codetabs.com/count-loc/count-loc-online.html , je n'ai pas essayé s'il est bon.
Tgr

Réponses:

298

Un script shell, cloc-git

Vous pouvez utiliser ce script shell pour compter le nombre de lignes dans un référentiel Git distant avec une seule commande:

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

Installation

Ce script nécessite l' installation de CLOC («Count Lines of Code»). clocpeut probablement être installé avec votre gestionnaire de paquets - par exemple, brew install clocavec Homebrew . Il y a aussi une image docker publiée sousmribeiro/cloc .

Vous pouvez installer le script en enregistrant son code dans un fichier cloc-git, en l'exécutant chmod +x cloc-git, puis en déplaçant le fichier vers un dossier dans votre fichier $PATHtel que /usr/local/bin.

Usage

Le script prend un argument, qui est n'importe quelle URL qui git cloneaccepte. Les exemples sont https://github.com/evalEmpire/perl5i.git(HTTPS) ou [email protected]:evalEmpire/perl5i.git(SSH). Vous pouvez obtenir cette URL depuis n'importe quelle page de projet GitHub en cliquant sur «Cloner ou télécharger».

Exemple de sortie:

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

Alternatives

Exécutez les commandes manuellement

Si vous ne voulez pas déranger l'enregistrement et l'installation du script shell, vous pouvez exécuter les commandes manuellement. Un exemple:

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

Linguiste

Si vous souhaitez que les résultats correspondent exactement aux pourcentages de langue de GitHub, vous pouvez essayer d'installer Linguist au lieu de CLOC . Selon son fichier README , vous devez gem install linguistpuis exécuter linguist. Je n'ai pas pu le faire fonctionner ( problème # 2223 ).

Rory O'Kane
la source
6
La question d'origine spécifiée sans cloner le dépôt.
linuxdan
12
@linuxdan Mon script ne clone pas le repo entier; il passe --depth 1pour télécharger uniquement le commit le plus récent. Pour la plupart des référentiels, cela évite que la question d'origine ne craigne que le clonage ne prenne trop de temps.
Rory O'Kane
2
l'homme, cela fonctionne incroyablement! toujours demandé, combien de lignes j'ai codé)
Anatoly Yakimchuk
@ RoryO'Kane pouvons-nous utiliser clocpour obtenir les lignes de code dans un référentiel github sans cloner le dépôt sur notre machine (via en ligne). les cloc-gitclones donnés ci-dessus sont également projetés avant de commencer à compter le nombre de lignes
Kasun Siyambalapitiya
@KasunSiyambalapitiya Désolé, je ne connais aucun site Web en ligne qui fonctionne clocpour vous. Pour clocpouvoir compter les lignes dans le code, votre ordinateur doit télécharger ce code, mais seulement temporairement. Notez que même les navigateurs Web téléchargent techniquement des pages Web lorsque vous les visitez; ils les enregistrent simplement dans la mémoire au lieu du disque.
Rory O'Kane
228

Vous pouvez exécuter quelque chose comme

git ls-files | xargs wc -l

qui vous donnera le nombre total →

lignes de code

Ou utilisez cet outil → http://line-count.herokuapp.com/

Ahmad Awais
la source
8
La réponse courte à la question (trouver ce nombre à l'aide de github) est Non. Votre approche est la deuxième meilleure alternative, d'autant plus que nous pouvons filtrer tous les fichiers dont nous avons besoin de compter.
Bernard
32
Si vous souhaitez filtrer, par exemple, le code Python: git ls-files | grep '\.py' | xargs wc -l.
Felipe SS Schneider
3
Je faisais xargsà wc -ltous les fichiers utilisent ensuite manuellement awkpour résumer la colonne, OMG cela est tellement plus facile.
sdkks
1
Cette approche simple inclut des commentaires dans des fichiers. Les commentaires et les lignes vides ne sont pas toujours considérés comme des "lignes de code".
Mark Stosberg
2
Eh bien, la documentation est une énorme partie du code. Où traceriez-vous vraiment la ligne si vous supprimez les commentaires. Qu'en est-il des commentaires qui contiennent des informations de code comme les paramètres, qu'en est-il des commentaires qui désactivent ESLint pour la ligne suivante - qu'en est-il des lignes qui sont des commentaires à 80% après du code. Voyez où je vais avec ça.
Ahmad Awais
130

Il existe une extension pour le navigateur Google Chrome - GLOC qui fonctionne pour les dépôts publics et privés.

Compte le nombre de lignes de code d'un projet à partir de:

  • page de détail du projet
  • référentiels des utilisateurs
  • page d'organisation
  • page de résultats de recherche
  • page tendance
  • explorer la page

entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici

Artem Solovev
la source
3
voté bien que cela ne semble pas fonctionner pour les dépôts privés
Michail Michailidis
4
@MichailMichailidis Merci pour votre suggestion. Je le réparerai.
Artem Solovev
4
@Taurus mon commentaire n'était pas censé être un CR - du point de vue de l'utilisabilité, le dégradé fait le travail (pour la raison que vous avez mentionnée), je voulais dire que je ne suis pas un fan des couleurs choisies mais c'est juste mon opinion (subjective). Cheers :)
tech4242
2
@hellyale bien sûr. dans quelques semaines
Artem Solovev
2
@hellyale Cela fonctionne aussi pour les dépôts privés. Mettre à jour l'extension. Il y a plus de nouvelles fonctionnalités à utiliser
Artem Solovev
70

Si vous allez sur la page des graphiques / contributeurs, vous pouvez voir une liste de tous les contributeurs au référentiel et le nombre de lignes qu'ils ont ajoutées et supprimées.

Sauf si je manque quelque chose, la soustraction du nombre total de lignes supprimées du nombre total de lignes ajoutées parmi tous les contributeurs devrait donner le nombre total de lignes de code dans le référentiel. (EDIT: il s'avère que je manquais quelque chose après tout. Jetez un oeil au commentaire d' Orbitbot pour plus de détails.)

MISE À JOUR:

Ces données sont également disponibles dans l' API de GitHub . J'ai donc écrit un script rapide pour récupérer les données et faire le calcul:

'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

Collez-le simplement dans un extrait Chrome DevTools, modifiez le dépôt et cliquez sur Exécuter.

Clause de non-responsabilité (merci à lovasoa ):

Prenez les résultats de cette méthode avec un grain de sel, car pour certains dépôts (sorich87 / bootstrap-tour), il en résulte des valeurs négatives, ce qui pourrait indiquer qu'il y a un problème avec les données renvoyées par l'API de GitHub.

MISE À JOUR:

On dirait que cette méthode pour calculer le nombre total de lignes n'est pas entièrement fiable. Jetez un œil au commentaire d' Orbitbot pour plus de détails.

Lewis
la source
Droite. Mais dans certains cas où le projet est un grand projet communautaire open-source, ce type de décompte n'est pas réalisable.
franklin
@franklin Certainement. Cependant, ces données sont également disponibles dans l' API de GitHub , vous pouvez donc écrire un script pour calculer assez facilement le nombre total de lignes. J'ai mis à jour ma réponse avec un script rapide que je viens d'écrire.
Lewis
Il serait plus simple d'utiliser l'API code_frequecy. Donner: 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 ... Intéressant: testez votre code sur sorich87 / bootstrap-tour. Le résultat est négatif.
lovasoa
3
@Lewis Je pense que vous ne tenez pas compte du fait que les lignes ajoutées / supprimées dans un commit peuvent être les mêmes que les autres commits, par exemple lors de la fusion de branches, etc. qui comptent toujours pour le même total. De plus, par exemple, les statistiques de contributions Github pour les profils utilisateur sont uniquement comptées à partir de la branche par défaut ou des pages gh, il peut donc y avoir quelque chose de similaire pour les statistiques de validation / ligne: help.github.com/articles/… . Notez également que les statistiques du profil utilisateur ne comptent que l'année précédente, mais je pense que les statistiques de validation sur la page du graphique sont permanentes.
orbitbot
38

Vous pouvez cloner uniquement la dernière validation à l'aide de git clone --depth 1 <url>, puis effectuer votre propre analyse à l'aide de Linguist , le même logiciel que Github utilise. C'est la seule façon dont je sais que vous allez obtenir des lignes de code.

Une autre option consiste à utiliser l'API pour répertorier les langues utilisées par le projet . Il ne les donne pas en lignes mais en octets. Par exemple...

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

Bien que prenez cela avec un grain de sel, ce projet inclut YAML et JSON que le site Web reconnaît, mais l'API ne le fait pas.

Enfin, vous pouvez utiliser la recherche de code pour demander quels fichiers correspondent à une langue donnée. Cet exemple demande quels fichiers dans perl5i sont Perl. https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i. Il ne vous donnera pas de lignes, et vous devez demander la taille du fichier séparément en utilisant le retour urlpour chaque fichier.

Schwern
la source
Cool, je ne savais pas ça. Pouvez-vous confirmer que cela ne peut pas être fait sur le site Web de Github, cependant?
Hubro
Je ne peux pas le confirmer, mais je ne vois rien dans l'API ou sur le site Web de Github qui vous donnera des lignes. Ce sont tous des octets ou des pourcentages. Quelle est votre justification pour le faire via l'API au lieu du clonage?
Schwern
Ok, merci pour l'info cependant. Je vais demander le support Github.
Hubro
Linguist a l'air cool, mais comment faire pour qu'il vous montre des lignes de code? Il semble qu'il affiche les octets par défaut, tout comme l'API.
Hubro
@Hubro Dunno, vous devrez peut-être le corriger.
Schwern
33

Pas actuellement possible sur Github.com ou leurs API

J'ai parlé au support client et confirmé que cela ne peut pas être fait sur github.com. Ils ont cependant transmis la suggestion à l'équipe Github, alors j'espère que cela sera possible à l'avenir. Si c'est le cas, je ne manquerai pas de modifier cette réponse.

Pendant ce temps, la réponse de Rory O'Kane est une brillante alternative basée sur clocet un clone de dépôt peu profond.

Hubro
la source
2
Pas directement, mais leur API Statistics possède toutes les données dont vous avez besoin pour le calculer vous-même. Voir ma réponse ci-dessous pour un script rapide qui fait cela.
Lewis
12

Vous pouvez utiliser l'API GitHub pour obtenir le sloc comme la fonction suivante

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

Personnellement, j'ai fait une extension chrome qui montre le nombre de SLOC sur la liste des projets github et la page de détails du projet. Vous pouvez également définir votre jeton d'accès personnel pour accéder aux référentiels privés et contourner la limite de débit de l'API.

Vous pouvez télécharger ici https://chrome.google.com/webstore/detail/github-sloc/fkjjjamhihnjmihibcmdnianbcbccpnn

Le code source est disponible ici https://github.com/martianyi/github-sloc

Yi Kai
la source
Pour l'extension chrome, comment le SLOC est-il déterminé? Tous les types de fichiers? Exclure des répertoires spécifiques?
Brett Reinhard
@BrettReinhard Il est basé sur le nombre d'ajouts et de suppressions par semaine , je pense qu'il inclut tous les fichiers.
Yi Kai
Cela ne renvoie-t-il pas simplement le nombre de changements de la semaine dernière?
Johannes 'fish' Ziemke
@ Johannes'fish'Ziemke Non, il revient chaque semaine
Yi Kai
11

Module complémentaire Firefox Github SLOC

J'ai écrit un petit addon firefox qui imprime le nombre de lignes de code sur les pages de projet github: Github SLOC

lovasoa
la source
Super plugin, très utile! Savez-vous s'il est possible de le faire fonctionner avec des dépôts privés? Il semble ne montrer que LOC sur les dépôts publics.
rococo
Le lien est mort et après une recherche manuelle, il semble que ce plugin n'existe malheureusement plus.
dCSeven
Il y a aussi une demande pour rendre GLOC disponible pour Firefox, et le développeur semble ouvert à l'idée: github.com/artem-solovev/gloc/issues/23
miyalys
1
@miyalys C'est fait maintenant: addons.mozilla.org/en-US/firefox/addon/gloc
Shachaf Zohar
7

Si la question est "pouvez-vous obtenir rapidement NOMBRE DE LIGNES d'un dépôt github", la réponse est non comme indiqué par les autres réponses.

Cependant, si la question est "pouvez-vous vérifier rapidement l'ÉCHELLE d'un projet", j'évalue généralement un projet en regardant sa taille. Bien sûr, la taille inclura les deltas de toutes les validations actives, mais c'est une bonne métrique car l'ordre de grandeur est assez proche.

Par exemple

Quelle est la taille du projet "docker"?

Dans votre navigateur, entrez api.github.com/repos/ORG_NAME/PROJECT_NAME, c'est-à-dire api.github.com/repos/docker/docker

Dans le hachage de réponse, vous pouvez trouver l'attribut size:

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

Cela devrait vous donner une idée de l'échelle relative du projet. Le nombre semble être en Ko, mais lorsque je l'ai vérifié sur mon ordinateur, il est en fait plus petit, même si l'ordre de grandeur est cohérent. (161432 Ko = 161 Mo, docker du -s -h = 65 Mo)

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

Instructions et explication

  1. Installez sloc à partir de npm , un outil de ligne de commande ( Node.js doit être installé).
npm install sloc -g
  1. Clonez le référentiel superficiel (téléchargement plus rapide que le clone complet).
git clone --depth 1 https://github.com/facebook/react/
  1. Exécutez sloc et spécifiez le chemin à analyser.
sloc ".\react\src" --format cli-table

sloc prend en charge le formatage de la sortie en tant que cli-table, comme jsonou csv. Les expressions régulières peuvent être utilisées pour exclure des fichiers et des dossiers ( Plus d'informations sur npm ).

  1. Supprimer le dossier du référentiel (facultatif)

Powershell: rm -r -force ".\react\"ou sur Mac / Unix:rm -rf ".\react\"

Captures d'écran des étapes exécutées (cli-table):

sortie sloc comme acli-table

sortie sloc (aucun argument):

sortie sloc sans arguments

Tobi Obeck
la source
Cela ne semble pas fonctionner pour les fichiers R tels que .R ou .Rmd
jzadra
1

Dirigez la sortie du nombre de lignes de chaque fichier vers sortpour organiser les fichiers par nombre de lignes . git ls-files | xargs wc -l |sort -n

KhmerCoder
la source
0

Ouvrez le terminal et exécutez ce qui suit:

curl https://api.codetabs.com/v1/loc?github=username/reponame
ishandutta2007
la source