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

412

In einem GitHub-Repository sehen Sie "Sprachstatistiken", die den Prozentsatz des Projekts anzeigen, der in einer Sprache geschrieben wurde. 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 Codezeilen implizieren ein relativ einfaches Projekt, 100.000 Codezeilen implizieren ein sehr großes / kompliziertes Projekt.

Ist es also möglich, die in den verschiedenen Sprachen geschriebenen Codezeilen aus einem GitHub-Repository abzurufen, 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 Wine dauert beispielsweise ewig.
  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 Code in anderen Sprachen wie JavaScript vermissen. Sie müssen vorher wissen, welche Sprachen das Projekt verwendet. Sie müssten auch die Zählung 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“.

Hubro
quelle
4
@Schwern: Hab nicht wirklich darüber nachgedacht. Das letzte Commit der Hauptniederlassung, nehme ich an.
Hubro
8
@Abizern: Ist das ein triftiger Grund, eine Frage zu schließen? Ich versuche das in den Richtlinien zu finden . Mein Plan war, zuerst nach SO zu fragen. Wenn sich dies als zwecklos herausstellen würde, würde ich den Github-Kundendienst fragen und deren Informationen als Antwort hier veröffentlichen.
Hubro
7
@Abizern: Siehe zum Thema . Es heißt, Sie können Fragen zu "Software-Tools stellen, die häufig von Programmierern verwendet werden".
Hubro
1
@ Hubro 1 Ich habe mit gelöst git clone --depth 1. Ich vermute, dass es für 2 und 3 Software gibt, die die Analyse für Sie durchführen kann, und Sie können anhand von Dateierweiterungen viel raten, aber ich habe verdammt viel Zeit, um eine gute Suche zu finden Begriff, um die Software zu finden. Vielleicht müssen Sie eine andere Frage stellen.
Schwern
1
Es gibt ein Online-Tool unter codetabs.com/count-loc/count-loc-online.html. Ich habe nicht versucht, ob es etwas Gutes ist.
Tgr

Antworten:

298

Ein Shell-Skript, cloc-git

Mit diesem Shell-Skript können Sie die Anzahl der Zeilen in einem Remote-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 ("Count Lines of Code") installiert sein. clockann wahrscheinlich mit Ihrem Paketmanager installiert werden - zum Beispiel brew install clocmit Homebrew . Es gibt auch ein Docker-Bild unter veröffentlichtmribeiro/cloc .

Sie können das Skript installieren , indem Sie ihren Code in einer Datei speichern cloc-git, ausgeführt wird chmod +x cloc-git, und dann die Datei in Ihrem zu einem Ordner zu verschieben $PATH, wie /usr/local/bin.

Verwendungszweck

Das Skript verwendet ein Argument, nämlich eine beliebige URL, git clonedie akzeptiert wird. 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 . Laut README müssen Sie gem install linguistund dann ausführen linguist. Ich konnte es nicht zum Laufen bringen ( Problem Nr. 2223 ).

Rory O'Kane
quelle
6
Die ursprüngliche Frage wurde angegeben, ohne das Repo zu klonen.
Linuxdan
12
@linuxdan Mein Skript klont nicht das gesamte Repo. Es wird --depth 1nur das letzte Commit heruntergeladen. Bei den meisten Repos wird dadurch die Sorge der ursprünglichen Frage vermieden, dass das Klonen zu lange dauert.
Rory O'Kane
2
Mann, das funktioniert erstaunlich! Ich habe mich immer gefragt, wie viele Zeilen ich codiert habe.)
Anatoly Yakimchuk
@ RoryO'Kane können wir verwenden cloc, um die Codezeilen in einem Github-Repository abzurufen, ohne das Repo auf unseren Computer zu klonen (über Online). Die oben angegebenen cloc-gitKlone werden zuerst projiziert, bevor die Anzahl der Zeilen gezählt wird
Kasun Siyambalapitiya
@KasunSiyambalapitiya Entschuldigung, ich kenne keine Online-Website, die clocfür Sie läuft . Um clocZeilen im Code zu zählen, muss Ihr Computer diesen Code herunterladen, allerdings nur vorübergehend. Beachten Sie, dass selbst Webbrowser Webseiten technisch herunterladen, wenn Sie sie besuchen. Sie speichern sie nur im Speicher anstatt auf der Festplatte.
Rory O'Kane
223

Sie können so etwas ausführen

git ls-files | xargs wc -l

Das gibt Ihnen die Gesamtzahl →

Zeilen von Code

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

Ahmad Awais
quelle
8
Die kurze Antwort auf die Frage (Finden dieser Nummer mit Github) lautet Nein. Ihr Ansatz ist die zweitbeste Alternative, zumal wir alle Dateien herausfiltern können, die wir zählen müssen.
Bernard
31
Wenn Sie z. B. Python-Code filtern möchten : git ls-files | grep '\.py' | xargs wc -l.
Felipe SS Schneider
3
Ich xargshabe wc -lalle Dateien manuell bearbeitet und dann verwendet, awkum die Spalte zu summieren. OMG, das ist so viel einfacher.
SDKKS
1
Dieser einfache Ansatz enthält Kommentare in Dateien. Kommentare und Leerzeilen werden nicht immer als "Codezeilen" betrachtet.
Mark Stosberg
2
Nun, Dokumentation ist ein großer Teil des Codes. Wo würdest du wirklich die Grenze ziehen, wenn du Kommentare rauswirfst? Was ist mit Kommentaren, die Code-Informationen wie Parameter enthalten, was ist mit Kommentaren, die ESLint für die nächste Zeile deaktivieren - was ist mit Zeilen, die 80% Kommentare nach etwas Code sind. Sehen Sie, wohin ich damit gehe.
Ahmad Awais
127

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

Zählt die Anzahl der Codezeilen eines Projekts aus:

  • Projektdetailseite
  • Benutzer-Repositorys
  • Organisationsseite
  • Suchergebnisseite
  • Trendseite
  • Seite erkunden

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Artem Solovev
quelle
3
upvoted obwohl es nicht für private Repositories zu funktionieren scheint
Michail Michailidis
4
@MichailMichailidis Vielen Dank für Ihren Vorschlag. Ich werde es reparieren.
Artem Solovev
4
@Taurus Mein Kommentar war nicht als CR gedacht - vom Standpunkt der Benutzerfreundlichkeit aus macht der Farbverlauf den Job (aus dem von Ihnen genannten Grund). Ich meinte, dass ich kein Fan der ausgewählten Farben bin, aber das ist nur meine (subjektive) Meinung. Prost :)
tech4242
2
@ Hellyale sicher. in ein paar Wochen
Artem Solovev
2
@hellyale Es funktioniert auch für private Repos. Erweiterung aktualisieren. Es gibt mehr neue Funktionen zu verwenden
Artem Solovev
70

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

Sofern mir nichts fehlt, sollte das Subtrahieren der Gesamtzahl der gelöschten Zeilen von der Gesamtzahl der Zeilen, die unter allen Mitwirkenden hinzugefügt wurden, die Gesamtzahl der Codezeilen im Repo ergeben. (BEARBEITEN: Es stellt sich heraus, dass mir doch etwas gefehlt hat. Weitere Informationen finden Sie in Orbitbots Kommentar .)

AKTUALISIEREN:

Diese Daten sind auch in der GitHub- API verfügbar . Also schrieb ich ein schnelles Skript, um die Daten abzurufen und die Berechnung durchzuführen:

'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

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, da dies bei einigen Repos (sorich87 / bootstrap-tour) zu negativen Werten führt, die möglicherweise darauf hinweisen, dass mit den von der GitHub-API zurückgegebenen Daten etwas nicht stimmt.

AKTUALISIEREN:

Diese Methode zur Berechnung der Gesamtzahl der Zeilen scheint nicht ganz zuverlässig zu sein. Werfen Sie einen Blick auf orbitbot Kommentar für weitere Einzelheiten.

Lewis
quelle
Recht. In einigen Fällen, in denen es sich bei dem Projekt um ein großes Open-Source-Community-Projekt handelt, ist eine solche Zählung nicht möglich.
Franklin
@ Franklin Auf jeden Fall. Diese Daten sind jedoch auch in der GitHub- API verfügbar , sodass Sie ein Skript schreiben können, um die Gesamtzahl der Zeilen ziemlich einfach zu berechnen. Ich habe meine Antwort mit einem kurzen Skript aktualisiert, das ich gerade geschrieben habe.
Lewis
Es wäre einfacher, die code_frequecy-API zu verwenden. Geben: 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 ... Interessant: Testen Sie Ihren Code auf sorich87 / bootstrap-tour. Das Ergebnis ist negativ.
Lovasoa
3
@ Lewis Ich denke, Sie ignorieren, dass Zeilen, die in einem Commit hinzugefügt / entfernt werden, mit anderen Commits identisch sein können, z. B. beim Zusammenführen von Zweigen usw., die immer noch für dieselbe Summe zählen. Außerdem werden die Github-Beitragsstatistiken für Benutzerprofile nur aus dem Standardzweig oder den Gh-Seiten gezählt, sodass für die Commit- / Zeilenstatistiken möglicherweise etwas Ähnliches passiert : help.github.com/articles/… . Beachten Sie auch, dass die Benutzerprofilstatistiken nur das Vorjahr zählen, aber ich denke, dass die Commit-Statistiken auf der Diagrammseite dauerhaft sind.
Orbitbot
38

Sie können nur das neueste Commit mit Linguist klonen git clone --depth 1 <url>und dann Ihre eigene Analyse mit Linguist durchführen , der gleichen Software, die Github verwendet. Nur so weiß ich, dass Sie Linien bekommen werden Code.

Eine andere Möglichkeit besteht darin , die API zu verwenden, 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 Sie das mit einem Körnchen Salz, aber dieses Projekt enthält YAML und JSON, die die Website anerkennt , die API jedoch nicht.

Schließlich können Sie mithilfe der Codesuche fragen, welche Dateien einer bestimmten Sprache entsprechen. In diesem Beispiel wird gefragt, welche Dateien in perl5i Perl sind. https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i. Sie erhalten keine Zeilen, und Sie müssen die Dateigröße separat anhand der urlfür jede Datei zurückgegebenen Größe erfragen .

Schwern
quelle
Cool, wusste nichts davon. Können Sie bestätigen, dass dies auf der Github-Website nicht möglich ist?
Hubro
Ich kann es nicht bestätigen, aber ich sehe in der API oder auf der Github-Website nichts, was Ihnen Zeilen geben könnte. Es sind alles Bytes oder Prozentsätze. Was ist Ihr Grund, dies über die API zu tun, anstatt zu klonen?
Schwern
Ok, danke für die Info. Ich werde Github um Unterstützung bitten.
Hubro
Linguist Blicke kühlen, aber wie bekommt man es Ihnen zu zeigen , Zeilen von Code obwohl? Es sieht so aus, als würde standardmäßig Bytes angezeigt, genau wie bei der API.
Hubro
@Hubro Keine Ahnung, möglicherweise müssen Sie es patchen.
Schwern
33

Derzeit nicht auf Github.com oder deren APIs 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, sodass dies hoffentlich in Zukunft möglich sein wird. Wenn ja, werde ich diese Antwort sicher bearbeiten.

In der Zwischenzeit ist Rory O'Kanes Antwort eine brillante Alternative clocund ein flacher Repo-Klon.

Hubro
quelle
2
Nicht direkt, aber die Statistik-API enthält alle Daten, die Sie benötigen, um sie selbst zu berechnen. In meiner Antwort unten finden Sie ein kurzes Skript, das dies ausführt.
Lewis
12

Sie können die GitHub-API verwenden, um den Sloc wie folgt 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 auch Ihr persönliches Zugriffstoken festlegen, um auf private Repositorys zuzugreifen und das API-Ratenlimit zu umgehen.

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

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

Yi Kai
quelle
Wie wird für die Chrome-Erweiterung der SLOC bestimmt? Alle Dateitypen? Bestimmte Verzeichnisse ausschließen?
Brett Reinhard
@BrettReinhard Es basiert auf der Anzahl der Hinzufügungen und Löschungen pro Woche . Ich denke, es enthält alle Dateien.
Yi Kai
Gibt das nicht nur die Anzahl der Änderungen in der letzten Woche zurück?
Johannes 'Fisch' Ziemke
@ Johannes'fish'Ziemke Nein, es kommt jede Woche zurück
Yi Kai
11

Firefox-Add-On Github SLOC

Ich habe ein kleines Firefox-Addon geschrieben, das die Anzahl der Codezeilen auf Github-Projektseiten druckt: Github SLOC

Lovasoa
quelle
Tolles Plugin, sehr hilfreich! Wissen Sie, ob es möglich ist, es mit privaten Repos zum Laufen zu bringen? Es scheint nur LOC auf öffentlichen Repos zu zeigen.
Rokoko
Der Link ist tot und nach manueller Suche scheint dieses Plugin leider nicht mehr zu existieren.
DCSeven
Es gibt eine Anfrage, GLOC auch für Firefox verfügbar zu machen, und der Entwickler scheint offen für die Idee zu sein: github.com/artem-solovev/gloc/issues/23
miyalys
1
@miyalys Es ist jetzt fertig: addons.mozilla.org/en-US/firefox/addon/gloc
Shachaf Zohar
7

Wenn die Frage lautet: "Können Sie schnell die Anzahl der Zeilen eines Github-Repos erhalten?", Lautet die Antwort "Nein", wie in den anderen Antworten angegeben.

Wenn jedoch die Frage lautet: " Können Sie die SKALA eines Projekts schnell überprüfen?", Beurteile ich ein Projekt normalerweise anhand seiner Größe. Natürlich wird die Größe Deltas aus 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, dh api.github.com/repos/docker/docker

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

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

Dies sollte Ihnen eine Vorstellung vom relativen Umfang des Projekts geben. 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)

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

Anleitung und Erklärung

  1. Installieren Sie sloc von npm , einem Befehlszeilentool ( Node.js muss installiert sein).
npm install sloc -g
  1. Flaches Repository klonen (schnellerer Download als vollständiger Klon).
git clone --depth 1 https://github.com/facebook/react/
  1. Führen Sie sloc aus und geben Sie den Pfad an, der analysiert werden soll.
sloc ".\react\src" --format cli-table

sloc unterstützt die Formatierung der Ausgabe als cli-table, als jsonoder csv. Reguläre Ausdrücke können verwendet werden, um Dateien und Ordner auszuschließen ( Weitere Informationen zu npm ).

  1. Repository-Ordner löschen (optional)

Powershell: rm -r -force ".\react\"oder unter Mac / Unix:rm -rf ".\react\"

Screenshots der ausgeführten Schritte (Cli-Tabelle):

Sloc-Ausgabe als Acli-Tabelle

Sloc-Ausgabe (keine Argumente):

Sloc-Ausgabe ohne Argumente

Tobi Obeck
quelle
Dies scheint nicht für R-Dateien wie .R oder .Rmd
jzadra
1

Leiten Sie die Ausgabe aus der Anzahl der Zeilen in jeder Datei weiter, sortum die Dateien nach Zeilenanzahl zu organisieren. git ls-files | xargs wc -l |sort -n

KhmerCoder
quelle