web-dev-qa-db-fra.com

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

Dans un référentiel GitHub, vous pouvez voir les “statistiques de langue”, qui affichent le pourcentage du projet écrit dans une langue. Cependant, il n’affiche pas le nombre de lignes de code composant le projet. Souvent, je souhaite avoir rapidement une idée de l'ampleur et de la complexité d'un projet. 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érentes langues à 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. Cloner un projet comme Wine, par exemple, prend du temps.
  2. Vous compteriez les lignes dans les fichiers qui ne seraient pas nécessairement du code, comme les fichiers i13n.
  3. Si vous ne comptez que seulement (par exemple) Ruby fichiers, vous risquez de ne pas avoir accès à une quantité énorme de code dans d'autres langues, comme JavaScript. . Vous devez connaître à l’avance les langues utilisées par le projet. Vous devez également répéter le nombre pour chaque langue utilisée par le projet.

Globalement, cela prend potentiellement trop de temps pour "vérifier rapidement l’ampleur d’un projet".

335
Hubro

Un script shell, cloc-git

Vous pouvez utiliser ce script Shell pour compter le nombre de lignes d'un référentiel Git distant à l'aide d'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 ("Compter les lignes de code"). cloc peut probablement être installé avec votre gestionnaire de paquets - par exemple, brew install cloc avec Homebrew . Il y a aussi ne image de menu fixe publiée sous mribeiro/cloc .

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

Usage

Le script prend un argument, qui est toute URL que git clone acceptera. Les exemples sont https://github.com/evalEmpire/Perl5i.git (HTTPS) ou [email protected]:evalEmpire/Perl5i.git (SSH). Vous pouvez obtenir cette URL à partir de 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
-------------------------------------------------------------------------------

Des alternatives

Exécuter les commandes manuellement

Si vous ne souhaitez pas enregistrer et installer le 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 voulez 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 linguist, puis exécuter linguist. Je ne pouvais pas le faire fonctionner ( numéro # 222 ).

247
Rory O'Kane

Vous pouvez simplement exécuter quelque chose comme

git ls-files | xargs wc -l

qui vous donnera le nombre total →

lines of code

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

113
Ahmad Awais

Il existe une extension pour Google Chrome navigateur - GLOC qui fonctionne pour les pensions publiques et privées. .

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

  • page de détail du projet
  • page de résultats de recherche
  • page de tendance
  • etc.

One repoMany repos

101
Artem Solovev

Si vous accédez à la page 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.

À moins que quelque chose ne me manque, soustraire le 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 qu’il me manque quelque chose après tout. Regardez commentaire d’orbbitbot pour plus de détails.)

MISE À JOUR:

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

'use strict';

//replace jquery/jquery with the repo you're interested in
fetch('https://api.github.com/repos/jquery/jquery/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));

Collez-le simplement dans un fragment de code Chrome DevTools, modifiez le référentiel et cliquez sur Exécuter.

Disclaimer (merci à lovasoa ):

Prenez les résultats de cette méthode avec un grain de sel, car pour certains repos (sorich87/bootstrap-tour), il en résulte des valeurs négatives, ce qui peut indiquer 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 oeil à commentaire d'orbbitbot pour plus de détails.

63
Lewis

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

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

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

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

Enfin, vous pouvez utiliser recherche de code pour demander quels fichiers correspondent à une langue donnée. Cet exemple demande quels fichiers de Perl5i sont des fichiers 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 url renvoyé pour chaque fichier.

36
Schwern

Pas possible actuellement sur Github.com ou leurs API-s

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

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

32
Hubro

Vous pouvez utiliser l'API GitHub pour obtenir le sloc comme pour 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 créé une extension chrome qui indique le nombre de SLOC sur la liste de projets github et sur la page de détails du projet. Vous pouvez également configurer 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 à partir d'ici https://chrome.google.com/webstore/detail/github-sloc/fkjjjamhihnmimidnianbcbccpnn

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

11
Yi Kai

Add-on Firefox Github SLOC

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

10
lovasoa

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

Toutefois, si la question est "pouvez-vous rapidement vérifier 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 tous les commits actifs, mais il s’agit d’une bonne métrique car son 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 i.e. 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’ampleur 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. (161432KB = 161Mo, docker du -s -h = 65Mo)

8
Jimmy Da