it-swarm.com.de

Können Sie die Anzahl der Codezeilen aus einem GitHub-Repository abrufen?

In einem GitHub-Repository sehen Sie "Sprachstatistik", die den Prozentsatz des Projekts anzeigt, das in einer Sprache geschrieben ist. Es wird jedoch nicht angezeigt, aus wie vielen Codezeilen das Projekt besteht. Oft möchte ich schnell einen Eindruck von der Größe und Komplexität eines Projekts bekommen, und die Anzahl der Codezeilen kann einen guten ersten Eindruck vermitteln. 500 Zeilen Code implizieren ein relativ einfaches Projekt, 100.000 Zeilen Code implizieren ein sehr großes/kompliziertes Projekt.

Ist es also möglich, die Codezeilen in den verschiedenen Sprachen aus einem GitHub-Repository zu erhalten, vorzugsweise ohne sie zu klonen?


Die Frage " Anzahl der Zeilen in einem Git-Repository zählen " fragt, wie die Codezeilen in einem lokalen Git-Repository gezählt werden sollen, aber:

  1. Sie müssen das Projekt klonen, was sehr umfangreich sein kann. Das Klonen eines Projekts wie beispielsweise Wine dauert Ewigkeiten.
  2. Sie würden Zeilen in Dateien zählen, die nicht unbedingt Code sind, wie z. B. i13n-Dateien.
  3. Wenn Sie nur (zum Beispiel) Ruby Dateien zählen, werden Sie möglicherweise eine große Menge an Code in anderen Sprachen wie JavaScript vermissen . Sie müssen zuvor wissen, welche Sprachen das Projekt verwendet. Sie müssen die Zählung auch für jede Sprache wiederholen, die das Projekt verwendet.

Alles in allem ist dies möglicherweise viel zu zeitintensiv, um „den Umfang eines Projekts schnell zu überprüfen“.

335
Hubro

Ein Shell-Skript, cloc-git

Mit diesem Shell-Skript können Sie die Anzahl der Zeilen in einem entfernten Git-Repository mit einem Befehl zählen:

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

Für dieses Skript muss CLOC ("Codezeilen zählen") installiert sein. cloc kann wahrscheinlich mit Ihrem Paketmanager installiert werden - zum Beispiel brew install cloc mit Homebrew . Es gibt auch ein Docker-Bild, das unter mribeiro/cloc veröffentlicht wurde .

Sie können das Skript installieren, indem Sie den Code in einer Datei cloc-git speichern, chmod +x cloc-git ausführen und die Datei dann in einen Ordner in Ihrem $PATH verschieben, z. B. /usr/local/bin.

Verwendungszweck

Das Skript verwendet ein Argument, das eine beliebige URL ist, die git clone akzeptiert. Beispiele sind https://github.com/evalEmpire/Perl5i.git (HTTPS) oder [email protected]:evalEmpire/Perl5i.git (SSH). Sie können diese URL von jeder GitHub-Projektseite abrufen, indem Sie auf "Klonen oder Herunterladen" klicken.

Beispielausgabe:

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

Alternativen

Führen Sie die Befehle manuell aus

Wenn Sie das Shell-Skript nicht speichern und installieren möchten, können Sie die Befehle manuell ausführen. Ein Beispiel:

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

Linguist

Wenn die Ergebnisse genau mit den Sprachprozentsätzen von GitHub übereinstimmen sollen, können Sie versuchen, Linguist anstelle von CLOC zu installieren. Entsprechend seiner README müssen Sie gem install linguist und dann linguist ausführen. Ich konnte es nicht zum Laufen bringen ( Problem # 222 ).

247
Rory O'Kane

Sie können einfach so etwas ausführen

git ls-files | xargs wc -l

was gibt Ihnen die Gesamtzahl →

lines of code

Oder verwenden Sie dieses Tool → http://line-count.herokuapp.com/

113
Ahmad Awais

Es gibt eine Erweiterung für Google Chrome Browser - GLOC , die für öffentliche und private Repos funktioniert .

Zählt die Anzahl der Codezeilen eines Projekts aus:

  • projektdetailseite
  • suchergebnisseite
  • trending-Seite
  • usw.

One repoMany repos

101
Artem Solovev

Wenn Sie zur Seite "Diagramme/Mitwirkende" gehen, sehen Sie eine Liste aller Mitwirkenden am Repo und wie viele Zeilen sie hinzugefügt und entfernt haben.

Wenn ich nichts verpasse, sollte das Subtrahieren der Gesamtzahl der gelöschten Zeilen von der Gesamtzahl der hinzugefügten Zeilen unter allen Mitwirkenden die Gesamtzahl der Codezeilen im Repo ergeben. (BEARBEITEN: Es stellte sich heraus, dass mir doch etwas gefehlt hat. Schauen Sie sich orbitbots Kommentar für Details an.)

AKTUALISIEREN:

Diese Daten sind auch in GitHubs API verfügbar. Also habe ich ein schnelles Skript geschrieben, um die Daten abzurufen und die Berechnung durchzuführen:

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

Fügen Sie es einfach in ein Chrome DevTools-Snippet ein, ändern Sie das Repo und klicken Sie auf Ausführen.

Haftungsausschluss (danke an lovasoa ):

Nehmen Sie die Ergebnisse dieser Methode mit einem Körnchen Salz, denn für einige Repos (sorich87/bootstrap-tour) ergeben sich negative Werte, was darauf hindeuten könnte, dass etwas mit den von der GitHub-API zurückgegebenen Daten nicht stimmt.

AKTUALISIEREN:

Diese Methode zur Berechnung der Gesamtanzahl der Zeilen ist anscheinend nicht ganz zuverlässig. Schauen Sie sich orbitbots Kommentar für Details an.

63
Lewis

Sie können nur das letzte Commit mit git clone --depth 1 <url> klonen und dann Ihre eigene Analyse mit Linguist durchführen, der gleichen Software, die Github verwendet. Ich weiß nur so, dass Sie Codezeilen erhalten.

Eine andere Option ist Verwenden Sie die API, um die vom Projekt verwendeten Sprachen aufzulisten . Es gibt sie nicht in Zeilen, sondern in Bytes. Zum Beispiel...

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

Nehmen wir das mit einem Körnchen Salz, das Projekt einschließlich YAML und JSON, die von der Website anerkannt werden , aber die API nicht.

Schließlich können Sie Codesuche verwenden, um zu fragen, welche Dateien zu einer bestimmten Sprache passen. In diesem Beispiel werden Sie gefragt, welche Dateien in Perl5i Perl sind. https://api.github.com/search/code?q=language:Perl+repo:evalEmpire/Perl5i. Es gibt Ihnen keine Zeilen und Sie müssen die Dateigröße separat mit dem zurückgegebenen url für jede Datei abfragen.

36
Schwern

Auf Github.com oder deren APIs derzeit nicht möglich

Ich habe mit dem Kundensupport gesprochen und bestätigt, dass dies auf github.com nicht möglich ist. Sie haben den Vorschlag jedoch an das Github-Team weitergeleitet, so dass dies hoffentlich in Zukunft möglich sein wird. Wenn ja, werde ich diese Antwort auf jeden Fall bearbeiten.

In der Zwischenzeit ist Rory O'Kanes Antwort eine brillante Alternative basierend auf cloc und einem flachen Repo-Klon.

32
Hubro

Sie können die GitHub-API verwenden, um den Sloc wie die folgende Funktion abzurufen

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

Persönlich habe ich eine chrome -Erweiterung erstellt, die die SLOC-Nummer sowohl auf der Github-Projektliste als auch auf der Projektdetailseite anzeigt. Sie können Ihr persönliches Zugriffstoken auch so einrichten, dass es auf private Repositorys zugreift und das Api-Ratenlimit umgeht.

Sie können von hier herunterladen https://chrome.google.com/webstore/detail/github-sloc/fkjjjamhihnjmihibcmdnianbcbccpnn

Der Quellcode ist hier verfügbar https://github.com/martianyi/github-sloc

11
Yi Kai

Firefox-Add-On Github SLOC

Ich habe ein kleines Firefox-Addon geschrieben, das die Anzahl der Codezeilen auf den Seiten des Github-Projekts ausgibt: Github SLOC

10
lovasoa

Wenn die Frage lautet "Kannst du schnell ANZAHL DER LINIEN eines Github-Repos erhalten?", Lautet die Antwort "Nein", wie in den anderen Antworten angegeben.

Lautet die Frage jedoch "können Sie schnell den Maßstab eines Projekts überprüfen", bewerte ich ein Projekt normalerweise anhand seiner Größe. Natürlich wird die Größe Deltas von allen aktiven Commits enthalten, aber es ist eine gute Metrik, da die Größenordnung ziemlich nahe ist.

Z.B.

Wie groß ist das "Docker" -Projekt?

Geben Sie in Ihrem Browser api.github.com/repos/ORG_NAME/PROJECT_NAME ein, d. H. Api.github.com/repos/docker/docker

Im Antwort-Hash finden Sie das Größenattribut:

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

Dies sollte Ihnen einen Eindruck vom relativen Umfang des Projekts vermitteln. Die Zahl scheint in KB zu sein, aber als ich sie auf meinem Computer überprüft habe, ist sie tatsächlich kleiner, obwohl die Größenordnung konsistent ist. (161432 KB = 161 MB, du-s-h docker = 65 MB)

8
Jimmy Da