Puoi ottenere il numero di righe di codice da un repository GitHub?


418

In un repository GitHub puoi vedere le "statistiche della lingua", che mostrano la percentuale del progetto scritta in una lingua. Tuttavia, non mostra quante righe di codice sono costituite dal progetto. Spesso, voglio avere rapidamente un'idea della scala e della complessità di un progetto e il conteggio delle righe di codice può dare una buona prima impressione. 500 righe di codice implicano un progetto relativamente semplice, 100.000 righe di codice implicano un progetto molto grande / complicato.

Quindi, è possibile ottenere le righe di codice scritte nelle varie lingue da un repository GitHub, preferibilmente senza clonarlo?


La domanda " Conta il numero di righe in un repository git " chiede come contare le righe di codice in un repository Git locale, ma:

  1. Devi clonare il progetto, che potrebbe essere enorme. La clonazione di un progetto come Wine, ad esempio, richiede secoli.
  2. Conterresti le righe nei file che non sarebbero necessariamente codice, come i file i13n.
  3. Se conti solo (ad esempio) file Ruby, potresti perdere una grande quantità di codice in altre lingue, come JavaScript. Dovresti sapere in anticipo quali lingue utilizza il progetto. Dovresti anche ripetere il conteggio per ogni lingua utilizzata dal progetto.

Tutto sommato, questo è potenzialmente troppo dispendioso in termini di tempo per "controllare rapidamente la scala di un progetto".


4
@Schwern: Non ci ho pensato davvero. L'ultimo commit del ramo master, suppongo.
Hubro,

8
@Abizern: è un motivo valido per chiudere una domanda? Sto cercando di trovarlo nelle linee guida . Il mio piano era di chiedere prima su SO. Se ciò si rivelasse inutile, chiederei all'assistenza clienti di Github e pubblicare le loro informazioni come risposta qui.
Hubro,

7
@Abizern: vedi sull'argomento . Dice che puoi porre domande su "strumenti software comunemente usati dai programmatori".
Hubro,

1
@Hubro 1 Ho risolto git clone --depth 1. Per quanto riguarda 2 e 3, sospetto che ci sia un software là fuori che può fare l'analisi per te, e puoi fare molte ipotesi basate sulle estensioni dei file, ma sto divertendo un sacco a trovare una buona ricerca termine per trovare detto software. Forse devi fare un'altra domanda.
Schwern,

1
C'è uno strumento online su codetabs.com/count-loc/count-loc-online.html , non ho provato se va bene.
Tgr

Risposte:


298

Uno script di shell, cloc-git

Puoi usare questo script di shell per contare il numero di righe in un repository Git remoto con un solo comando:

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

Installazione

Questo script richiede l' installazione di CLOC ("Count Lines of Code"). clocprobabilmente può essere installato con il gestore pacchetti, ad esempio,brew install cloc con Homebrew . C'è anche un'immagine docker pubblicata sottomribeiro/cloc .

È possibile installare lo script salvando il suo codice in un file cloc-git, eseguendolo chmod +x cloc-gite quindi spostando il file in una cartella $PATHcome /usr/local/bin.

uso

Lo script accetta un argomento, ovvero qualsiasi URL git clone accetti. Esempi sono https://github.com/evalEmpire/perl5i.git(HTTPS) o git@github.com:evalEmpire/perl5i.git(SSH). Puoi ottenere questo URL da qualsiasi pagina del progetto GitHub facendo clic su "Clona o scarica".

Esempio di output:

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

alternative

Esegui i comandi manualmente

Se non vuoi preoccuparti di salvare e installare lo script della shell, puoi eseguire i comandi manualmente. Un esempio:

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

Linguista

Se desideri che i risultati corrispondano esattamente alle percentuali di lingua di GitHub, puoi provare a installare Linguist invece di CLOC . Secondo il suo README , è necessario gem install linguiste quindi eseguire linguist. Non sono riuscito a farlo funzionare ( numero 2223 ).


6
La domanda originale è stata specificata senza clonare il repository.
linuxdan,

12
@linuxdan Il mio script non clona l'intero repository; passa --depth 1per scaricare solo il commit più recente. Per la maggior parte dei repository, questo evita la preoccupazione della domanda originale sulla clonazione che impiega troppo tempo.
Rory O'Kane,

2
amico, funziona alla grande! mi sono sempre chiesto, quante righe ho codificato)
Anatoly Yakimchuk,

@ RoryO'Kane possiamo usare clocper ottenere le righe di codice in un repository github senza clonare il repository sulla nostra macchina (attraverso online). i suddetti cloc-gitprimi cloni da proiettare prima di iniziare a contare il numero di righe
Kasun Siyambalapitiya

@KasunSiyambalapitiya Siamo spiacenti, non conosco nessun sito Web online funzionante clocper te. Per clocpoter contare le righe nel codice, il tuo computer deve scaricare quel codice, anche se solo temporaneamente. Si noti che anche i browser Web scaricano tecnicamente pagine Web quando le visiti; li salvano semplicemente in memoria anziché su disco.
Rory O'Kane,

228

Puoi eseguire qualcosa del genere

git ls-files | xargs wc -l

che ti darà il conteggio totale →

righe di codice

Oppure usa questo strumento → http://line-count.herokuapp.com/


8
La risposta breve alla domanda (trovare questo numero usando github) è No. Il tuo approccio è la seconda migliore alternativa, specialmente perché possiamo filtrare tutti i file che dobbiamo contare.
Bernard,

32
Se si desidera filtrare, ad esempio, il codice Python: git ls-files | grep '\.py' | xargs wc -l.
Felipe SS Schneider,

3
Stavo facendo xargsa wc -ltutti i file manualmente, quindi utilizzare awkper riassumere la colonna, OMG questo è molto più facile.
sdkks,

1
Questo semplice approccio include commenti nei file. Commenti e righe vuote non sono sempre considerati "righe di codice".
Mark Stosberg,

2
Bene, la documentazione è una parte enorme del codice. Dove tracceresti davvero la linea se cancelli i commenti. Che dire dei commenti che contengono informazioni sul codice come params, che dire dei commenti che disabilitano ESLint per la riga successiva? Che dire delle righe che sono commenti all'80% dopo un po 'di codice. Vedi dove sto andando con questo.
Ahmad Awais,

130

Esiste un'estensione per il browser Google Chrome - GLOC che funziona per i repository pubblici e privati.

Conta il numero di righe di codice di un progetto da:

  • pagina dei dettagli del progetto
  • repository dell'utente
  • pagina dell'organizzazione
  • pagina dei risultati di ricerca
  • pagina di tendenza
  • esplora la pagina

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


3
votato anche se non sembra funzionare per repository privati
Michail Michailidis,

4
@MichailMichailidis Grazie per il tuo suggerimento. Lo aggiusterò.
Artem Solovev,

4
@Taurus il mio commento non è stato inteso come CR - dal punto di vista dell'usabilità il gradiente fa il lavoro (per il motivo che hai citato) Intendevo dire che non sono un fan dei colori scelti ma questa è solo la mia opinione (soggettiva). Saluti :)
tech4242

2
@hellyale sicuro. tra qualche settimana
Artem Solovev

2
@hellyale Funziona anche per repository privati. Estensione di aggiornamento. Ci sono altre nuove funzionalità da usare
Artem Solovev

70

Se vai alla pagina dei grafici / contributori, puoi vedere un elenco di tutti i contributori al repository e quante righe hanno aggiunto e rimosso.

A meno che non mi manchi qualcosa, sottrarre il numero aggregato di righe eliminate dal numero aggregato di righe aggiunte tra tutti i contributori dovrebbe produrre il numero totale di righe di codice nel repository. (EDIT: si scopre che mi mancava qualcosa dopo tutto. Dai un'occhiata al commento di orbitbot per i dettagli.)

AGGIORNARE:

Questi dati sono disponibili anche nell'API di GitHub . Quindi ho scritto uno script veloce per recuperare i dati e fare il calcolo:

'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

Basta incollarlo in uno snippet di Chrome DevTools, modificare il repository e fare clic su Esegui.

Disclaimer (grazie a lovasoa ):

Prendi i risultati di questo metodo con un pizzico di sale, perché per alcuni repository (sorich87 / bootstrap-tour) si traducono in valori negativi, che potrebbero indicare che c'è qualcosa di sbagliato nei dati restituiti dall'API di GitHub.

AGGIORNARE:

Sembra che questo metodo per calcolare i numeri di riga totali non sia del tutto affidabile. Dai un'occhiata al commento di orbitbot per i dettagli.


Giusto. Ma in alcuni casi in cui il progetto è un grande progetto di comunità open source, questo tipo di conteggio non è fattibile.
Franklin,

@franklin Sicuramente. Tuttavia, questi dati sono disponibili anche nell'API di GitHub , quindi puoi scrivere uno script per calcolare abbastanza facilmente il numero totale di righe. Ho aggiornato la mia risposta con una breve sceneggiatura che ho appena scritto.
Lewis,

Sarebbe più semplice usare l'API code_frequecy. Dare: 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, l'

Hmmm ... Interessante: prova il tuo codice su sorich87 / bootstrap-tour. Il risultato è negativo
Lovasoa,

3
@Lewis Penso che tu stia ignorando che le righe aggiunte / rimosse in un commit possono essere le stesse di altri commit, ad esempio quando si uniscono filiali ecc. Che contano comunque per lo stesso totale. Inoltre, le statistiche dei contributi di Github per i profili utente vengono conteggiate solo dalla filiale o dalle pagine gh predefinite, quindi potrebbe esserci qualcosa di simile in corso per le statistiche di commit / linea: help.github.com/articles/… . Si noti inoltre che le statistiche del profilo utente contano solo l'anno precedente, ma penso che le statistiche di commit nella pagina del grafico siano permanenti.
orbitbot,

38

Puoi clonare solo l'ultimo commit utilizzando git clone --depth 1 <url>e quindi eseguire la tua analisi utilizzando Linguist , lo stesso software utilizzato da Github. Questo è l'unico modo in cui so che otterrai righe di codice.

Un'altra opzione è utilizzare l'API per elencare le lingue utilizzate dal progetto . Non li dà in righe ma in byte. Per esempio...

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

Però prendilo con un pizzico di sale, quel progetto include YAML e JSON che il sito Web riconosce ma l'API no.

Infine, puoi utilizzare la ricerca del codice per chiedere quali file corrispondono a una determinata lingua. Questo esempio chiede quali file in perl5i sono Perl. https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i. Non ti darà linee e dovrai chiedere la dimensione del file separatamente usando il reso urlper ogni file.


Fantastico, non lo sapevo. Puoi confermare che non può essere fatto sul sito web di Github, però?
Hubro,

Non posso confermarlo, ma non vedo nulla nell'API o sul sito Web Github che ti dia linee. Sono tutti byte o percentuali. Qual è la tua logica per farlo tramite l'API anziché clonare?
Schwern,

Ok, grazie per le informazioni però. Chiederò supporto a Github.
Hubro,

Il linguista ha un bell'aspetto, ma come si ottiene per mostrarti le righe di codice? Sembra che mostri byte per impostazione predefinita, proprio come l'API.
Hubro,

@Hubro Dunno, potresti doverlo patchare.
Schwern,

33

Al momento non è possibile su Github.com o le loro API

Ho parlato con l'assistenza clienti e confermato che non è possibile farlo su github.com. Tuttavia, hanno passato il suggerimento al team di Github, quindi spero che sia possibile in futuro. In tal caso, sarò sicuro di modificare questa risposta.

Nel frattempo, la risposta di Rory O'Kane è una brillante alternativa basata su clocun clone repo poco profondo.


2
Non direttamente, ma la loro API Statistics ha tutti i dati necessari per calcolarli da soli. Vedi la mia risposta di seguito per un breve script che fa questo.
Lewis,

12

Puoi usare l'API GitHub per ottenere lo sloc come la seguente funzione

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

Personalmente ho realizzato un'estensione di Chrome che mostra il numero di SLOC sia nell'elenco dei progetti github che nella pagina dei dettagli del progetto. Puoi anche impostare il tuo token di accesso personale per accedere ai repository privati ​​e bypassare il limite di velocità API.

Puoi scaricare da qui https://chrome.google.com/webstore/detail/github-sloc/fkjjjamhihnjmihibcmdnianbcbccpnn

Il codice sorgente è disponibile qui https://github.com/martianyi/github-sloc


Per l'estensione Chrome come viene determinato SLOC? Tutti i tipi di file? Escludere directory specifiche?
Brett Reinhard,

@BrettReinhard Si basa sul numero di aggiunte ed eliminazioni a settimana , penso che includa tutti i file.
Yi Kai,

Non restituisce il numero di modifiche nell'ultima settimana?
Johannes "pesca" Ziemke il

@ Johannes'fish'Ziemke No, ritorna ogni settimana
Yi Kai

11

Componente aggiuntivo Firefox Github SLOC

Ho scritto un piccolo addon per Firefox che stampa il numero di righe di codice sulle pagine del progetto github: Github SLOC


Ottimo plugin, molto utile! Sai se è possibile farlo funzionare con repository privati? Sembra mostrare LOC su repository pubblici.
rococò,

Il link è morto e dopo aver cercato manualmente, sembra che purtroppo questo plugin non esista più.
dCSeven

C'è una richiesta per rendere disponibile GLOC anche per Firefox e lo sviluppatore sembra aperto all'idea: github.com/artem-solovev/gloc/issues/23
miyalys


7

Se la domanda è "puoi ottenere rapidamente NUMERO DI LINEE di un repository github", la risposta è no come indicato dalle altre risposte.

Tuttavia, se la domanda è "puoi verificare rapidamente la SCALA di un progetto", di solito misuro un progetto osservandone le dimensioni. Naturalmente la dimensione includerà delta da tutti i commit attivi, ma è una buona metrica in quanto l'ordine di grandezza è abbastanza vicino.

Per esempio

Quanto è grande il progetto "docker"?

Nel tuo browser, inserisci api.github.com/repos/ORG_NAME/PROJECT_NAME ovvero api.github.com/repos/docker/docker

Nell'hash di risposta, puoi trovare l'attributo size:

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

Questo dovrebbe darti un'idea della scala relativa del progetto. Il numero sembra essere in KB, ma quando l'ho controllato sul mio computer è in realtà più piccolo, anche se l'ordine di grandezza è coerente. (161432 KB = 161 MB, du -s -h docker = 65 MB)


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

Istruzioni e spiegazioni

  1. Installa sloc da npm , uno strumento da riga di comando (è necessario installare Node.js ).
npm install sloc -g
  1. Clone repository shallow (download più veloce del clone completo).
git clone --depth 1 https://github.com/facebook/react/
  1. Esegui sloc e specifica il percorso che dovrebbe essere analizzato.
sloc ".\react\src" --format cli-table

sloc supporta la formattazione dell'output come cli-table, come jsono csv. Le espressioni regolari possono essere utilizzate per escludere file e cartelle ( Ulteriori informazioni su npm ).

  1. Elimina cartella repository (opzionale)

Powershell: rm -r -force ".\react\"o su Mac / Unix:rm -rf ".\react\"

Schermate dei passaggi eseguiti (cli-table):

output sloc come acli-table

output sloc (nessun argomento):

output sloc senza argomenti


Questo non sembra funzionare con file R come .R o .Rmd
jzadra il

1

Inoltra l'output dal numero di righe in ciascun file sortper organizzare i file in base al conteggio delle righe. git ls-files | xargs wc -l |sort -n



0

Aprire il terminale ed eseguire quanto segue:

curl https://api.codetabs.com/v1/loc?github=username/reponame
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.