888 Stimmen

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

In einem GitHub-Repository können Sie "Sprachstatistiken" sehen, die den Prozentsatz des Projekts anzeigen, der in einer Sprache geschrieben ist. Es zeigt jedoch nicht an, wie viele Zeilen Code das Projekt umfasst. 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.

Also, ist es möglich, die in verschiedenen Sprachen geschriebenen Codezeilen aus einem GitHub-Repository zu erhalten, am besten ohne es zu klonen?


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

  1. Sie müssen das Projekt klonen, was riesig sein könnte. Das Klonen eines Projekts wie Wine dauert beispielsweise eine Ewigkeit.
  2. Sie würden Zeilen in Dateien zählen, die nicht unbedingt Code enthalten, wie z.B. 13n-Dateien.
  3. Wenn Sie z.B. nur Ruby-Dateien zählen würden, könnten Sie eine massive Menge an Code in anderen Sprachen wie JavaScript verpassen. Sie müssten im Voraus 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 zeitaufwändig, um "schnell die Größe eines Projekts zu überprüfen".

739voto

Ahmad Awais Punkte 28098

Sie können etwas wie ausführen

git ls-files | xargs wc -l

Was Ihnen die Gesamtzahl gibt!

Zeilen Code

Sie können auch weitere Anweisungen hinzufügen. Wie z.B. nur die JavaScript-Dateien anzeigen.

git ls-files | grep '\.js' | xargs wc -l

462voto

Rory O'Kane Punkte 27128

Ein Shell-Skript, cloc-git

Sie können dieses Shell-Skript verwenden, um die Anzahl der Zeilen in einem entfernten Git-Repository mit einem Befehl zu zählen:

#!/usr/bin/env bash
git clone --depth 1 "$1" temp-linecount-repo &&
  printf "('temp-linecount-repo' wird automatisch gelöscht)\n\n\n" &&
  cloc temp-linecount-repo &&
  rm -rf temp-linecount-repo

Installation

Dieses Skript erfordert, dass CLOC (“Count Lines of Code”) installiert ist. cloc kann wahrscheinlich mit Ihrem Paketmanager installiert werden - zum Beispiel mit brew install cloc mit Homebrew. Es gibt auch ein Docker-Image veröffentlicht unter mribeiro/cloc.

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

Verwendung

Das Skript akzeptiert ein Argument, das jede URL ist, die von git clone akzeptiert wird. Beispiele sind https://github.com/evalEmpire/perl5i.git (HTTPS) oder git@github.com:evalEmpire/perl5i.git (SSH). Sie können diese URL von jeder GitHub-Projektseite erhalten, 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' wird automatisch gelöscht)

     171 Textdateien.
     166 eindeutige Dateien.                                          
      17 Dateien ignoriert.

http://cloc.sourceforge.net v 1.62  T=1.13 s (134.1 dateien/s, 9764.6 zeilen/s)
-------------------------------------------------------------------------------
Sprache                     Dateien          Leerzeilen        Kommentare           Code
-------------------------------------------------------------------------------
Perl                           149           2795           1425           6382
JSON                             1              0              0            270
YAML                             2              0              0            198
-------------------------------------------------------------------------------
SUMME:                           152           2795           1425           6850
-------------------------------------------------------------------------------

Alternativen

Führen Sie die Befehle manuell aus

Wenn Sie sich nicht die Mühe machen wollen, das Shellskript zu speichern und zu installieren, 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 Sie möchten, dass die Ergebnisse genau den Sprachanteilen von GitHub entsprechen, können Sie versuchen, anstelle von CLOC Linguist zu installieren. Laut seiner README müssen Sie gem install linguist ausführen und dann linguist. Ich habe es nicht zum Laufen gebracht (Issue #2223).

222voto

Kas Elvirov Punkte 6640

Ich habe eine Erweiterung für den Google Chrome Browser erstellt - GLOC, die für öffentliche und private Repositorien funktioniert.

Zählt die Anzahl der Codezeilen eines Projekts von:

  • Projektdetailseite
  • Benutzer-Repositories
  • Organisationsseite
  • Suchergebnisseite
  • Trending-Seite
  • Explore-Seite

Hier Bildbeschreibung eingeben Hier Bildbeschreibung eingeben Hier Bildbeschreibung eingeben Hier Bildbeschreibung eingeben Hier Bildbeschreibung eingeben Hier Bildbeschreibung eingeben

101voto

Lewis Punkte 1473

Wenn Sie zur Seite "Graphen/Beiträger" gehen, können Sie eine Liste aller Mitwirkenden am Repository und wie viele Zeilen sie hinzugefügt und entfernt haben, sehen.

Wenn ich nichts übersehen habe, sollte die Differenz zwischen der Gesamtzahl der gelöschten Zeilen und der Gesamtzahl der hinzugefügten Zeilen aller Mitwirkenden die Gesamtzahl der Codezeilen im Repository ergeben. (EDIT: Es stellte sich heraus, dass ich doch etwas übersehen habe. Sehen Sie sich orbitbots Kommentar für Details an.)

UPDATE:

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

'use strict';

async function countGithub(repo) {
    const response = await fetch(`https://api.github.com/repos/${repo}/stats/contributors`)
    const contributors = await response.json();
    const lineCounts = contributors.map(contributor => (
        contributor.weeks.reduce((lineCount, week) => lineCount + week.a - week.d, 0)
    ));
    const lines = lineCounts.reduce((lineTotal, lineCount) => lineTotal + lineCount);
    window.alert(lines);
}

countGithub('jquery/jquery'); // oder zählen Sie beliebige andere Dinge

Einfach in einen Chrome DevTools-Schnipsel einfügen, das Repository ändern und auf "Ausführen" klicken.

Haftungsausschluss (Dank an lovasoa):

Nehmen Sie die Ergebnisse dieser Methode mit Vorsicht, da sie für einige Repos (sorich87/bootstrap-tour) zu negativen Werten führt, was darauf hindeuten könnte, dass mit den von der GitHub-API zurückgegebenen Daten etwas nicht stimmt.

UPDATE:

Es sieht so aus, als ob diese Methode zur Berechnung der Gesamtanzahl von Codezeilen nicht ganz zuverlässig ist. Werfen Sie einen Blick auf orbitbots Kommentar für Details.

51voto

Schwern Punkte 138322

Sie können einfach den neuesten Commit mit git clone --depth 1 klonen und dann Ihre eigene Analyse mit Linguist durchführen, derselben Software, die Github verwendet. Das ist der einzige Weg, den ich kenne, um Codezeilen zu erhalten.

Eine andere Option ist es, die API zu verwenden, um die Sprachen aufzulisten, die das Projekt verwendet. Es gibt sie nicht in Zeilen, sondern in Bytes. Zum Beispiel...

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

Aber nehmen Sie das mit einem Körnchen Salz, da das Projekt YAML und JSON enthält, wie die Website bestätigt, aber nicht die API.

Schließlich können Sie die Codesuche verwenden, um festzustellen, welche Dateien einer bestimmten Sprache entsprechen. Dieses Beispiel fragt nach Dateien in perl5i, die Perl sind. https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i. Es wird Ihnen keine Zeilen geben, und Sie müssen die Dateigröße separat mit dem zurückgegebenen url für jede Datei anfordern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X