Czy możesz pobrać liczbę wierszy kodu z repozytorium GitHub?

416

W repozytorium GitHub możesz zobaczyć „statystyki języka”, która wyświetla procent projektu napisanego w języku. Nie pokazuje jednak, ile wierszy kodu składa się z projektu. Często chcę szybko uzyskać wrażenie skali i złożoności projektu, a liczba wierszy kodu może dać dobre pierwsze wrażenie. 500 linii kodu oznacza stosunkowo prosty projekt, 100 000 linii kodu oznacza bardzo duży / skomplikowany projekt.

Czy możliwe jest uzyskanie wierszy kodu napisanych w różnych językach z repozytorium GitHub, najlepiej bez klonowania?


Pytanie „ Policz liczbę linii w repozytorium git ” pyta, jak policzyć linie kodu w lokalnym repozytorium Git, ale:

  1. Musisz sklonować projekt, który może być ogromny. Klonowanie projektu takiego jak na przykład Wine zajmuje wieki.
  2. Policzyłbyś wiersze w plikach, które niekoniecznie byłyby kodem, takie jak pliki i13n.
  3. Jeśli policzysz tylko (na przykład) pliki Ruby, potencjalnie stracisz ogromną ilość kodu w innych językach, takich jak JavaScript. Musisz wcześniej wiedzieć, jakich języków używa projekt. Musisz także powtórzyć liczenie dla każdego języka, którego używa projekt.

Podsumowując, jest to potencjalnie zbyt czasochłonne, aby „szybko sprawdzić skalę projektu”.

Hubro
źródło
4
@ Schwern: Naprawdę o tym nie myślałem. Przypuszczam, że najnowsze zatwierdzenie gałęzi master.
Hubro,
8
@Abizern: Czy to ważny powód do zamknięcia pytania? Próbuję znaleźć to w wytycznych . Moim planem było najpierw zapytać SO. Gdyby okazało się to bezskuteczne, poprosiłbym obsługę klienta Github i opublikowałem ich informacje jako odpowiedź tutaj.
Hubro,
7
@Abizern: Zobacz na temat . Mówi, że możesz zadawać pytania na temat „narzędzi programowych powszechnie używanych przez programistów”.
Hubro,
1
@Hubro 1 Rozwiązałem git clone --depth 1. Jeśli chodzi o 2 i 3, podejrzewam, że istnieje oprogramowanie, które może przeprowadzić analizę za Ciebie i możesz dużo zgadywać na podstawie rozszerzeń plików, ale mam sporo czasu, aby wymyślić dobre wyszukiwanie termin na znalezienie wspomnianego oprogramowania. Może musisz zadać kolejne pytanie.
Schwern,
1
Na stronie codetabs.com/count-loc/count-loc-online.html znajduje się narzędzie online. Nie próbowałem, czy jest dobre.
Tgr

Odpowiedzi:

298

Skrypt powłoki, cloc-git

Za pomocą tego skryptu powłoki można policzyć liczbę wierszy w zdalnym repozytorium Git za pomocą jednego polecenia:

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

Instalacja

Ten skrypt wymaga zainstalowania CLOC („Count Lines of Code”). clocprawdopodobnie można go zainstalować za pomocą menedżera pakietów - na przykład za brew install clocpomocą Homebrew . Istnieje również obraz dokera opublikowany podmribeiro/cloc .

Możesz zainstalować skrypt, zapisując jego kod do pliku cloc-git, uruchamiając chmod +x cloc-git, a następnie przenosząc plik do folderu w swoim, $PATHnp /usr/local/bin.

Stosowanie

Skrypt przyjmuje jeden argument, którym jest dowolny git cloneakceptowany adres URL . Przykładami są https://github.com/evalEmpire/perl5i.git(HTTPS) lub [email protected]:evalEmpire/perl5i.git(SSH). Możesz pobrać ten adres URL z dowolnej strony projektu GitHub, klikając „Klonuj lub pobierz”.

Przykładowe dane wyjściowe:

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

Alternatywy

Uruchom polecenia ręcznie

Jeśli nie chcesz zawracać sobie głowy zapisywaniem i instalowaniem skryptu powłoki, możesz uruchomić polecenia ręcznie. Przykład:

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

Językoznawca

Jeśli chcesz, aby wyniki dokładnie odpowiadały procentom językowym GitHub, możesz spróbować zainstalować Linguist zamiast CLOC . Zgodnie z README musisz gem install linguisturuchomić, a następnie uruchomić linguist. Nie mogłem zmusić go do pracy ( problem nr 2223 ).

Rory O'Kane
źródło
6
Pierwotne pytanie określone bez klonowania repozytorium.
linuxdan
12
@linuxdan Mój skrypt nie klonuje całego repozytorium; przechodzi --depth 1tylko do pobrania ostatniego zatwierdzenia. W przypadku większości repozytoriów pozwala to uniknąć pierwotnego pytania o zbyt długie klonowanie.
Rory O'Kane
2
stary, to działa niesamowicie! zawsze zastanawiałem się, ile wierszy zakodowałem)
Anatolij Yakimchuk
@ RoryO'Kane możemy użyć, clocaby uzyskać wiersze kodu w repozytorium github bez klonowania repozytorium na naszym komputerze (przez Internet). powyższe podane cloc-gitrównież pierwsze klony do projektu przed rozpoczęciem liczenia liczby linii
Kasun Siyambalapitiya
@KasunSiyambalapitiya Przepraszamy, nie znam żadnej strony internetowej, która działałaby clocdla Ciebie. Aby clocpoliczyć wiersze w kodzie, komputer musi pobrać ten kod, choć tylko tymczasowo. Pamiętaj, że nawet przeglądarki internetowe technicznie pobierają strony internetowe, gdy je odwiedzasz; po prostu zapisują je w pamięci zamiast na dysku.
Rory O'Kane
226

Możesz uruchomić coś takiego

git ls-files | xargs wc -l

co da ci całkowitą liczbę →

wiersze kodu

Lub użyj tego narzędzia → http://line-count.herokuapp.com/

Ahmad Awais
źródło
8
Krótka odpowiedź na pytanie (znalezienie tego numeru za pomocą github) brzmi: nie. Twoje podejście jest drugą najlepszą alternatywą, zwłaszcza, że ​​możemy odfiltrować wszystkie pliki, które musimy policzyć.
Bernard
32
Jeśli chcesz, aby filtr, np kodzie Pythona: git ls-files | grep '\.py' | xargs wc -l.
Felipe SS Schneider,
3
Robiłem xargsdo wc -lwszystkich plików, a następnie za pomocą ręcznie awkpodsumować kolumnę, OMG to jest o wiele łatwiej.
sdkks
1
To proste podejście obejmuje komentarze w plikach. Komentarze i puste wiersze nie zawsze są uważane za „wiersze kodu”.
Mark Stosberg
2
Dokumentacja to ogromna część kodu. Gdzie naprawdę wytyczysz linię, jeśli wyrzucisz komentarze. Co z komentarzami zawierającymi informacje o kodzie, takimi jak parametry, co z komentarzami, które wyłączają ESLint dla następnego wiersza - co z wierszami, które są 80% komentarzami po pewnym kodzie. Zobacz, gdzie idę z tym.
Ahmad Awais,
128

Istnieje rozszerzenie przeglądarki Google Chrome - GLOC, która działa w publicznych i prywatnych repozytoriach.

Liczy liczbę wierszy kodu projektu z:

  • strona szczegółów projektu
  • repozytoria użytkownika
  • strona organizacji
  • strona wyników wyszukiwania
  • strona trendów
  • eksploruj stronę

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Artem Solovev
źródło
3
głosowano, choć wydaje się, że nie działa w prywatnych repozytoriach
Michail Michailidis
4
@MichailMichailidis Dziękujemy za sugestię. Naprawię to.
Artem Solovev
4
@ Taurus mój komentarz nie miał być CR - z punktu widzenia użyteczności gradient spełnia swoje zadanie (z powodu, o którym wspomniałeś) Miałem na myśli, że nie jestem fanem wybranych kolorów, ale to tylko moja (subiektywna) opinia. Na zdrowie :)
tech4242,
2
@hellyale na pewno. za kilka tygodni
Artem Solovev
2
@hellyale Działa również w przypadku prywatnych repozytoriów. Zaktualizuj rozszerzenie. Jest więcej nowych funkcji do użycia
Artem Solovev
70

Jeśli przejdziesz na stronę wykresów / autorów, zobaczysz listę wszystkich autorów repozytorium oraz liczbę dodanych i usuniętych linii.

O ile mi czegoś nie brakuje, odjęcie łącznej liczby wierszy usuniętych od łącznej liczby wierszy dodanych wśród wszystkich autorów powinno dać całkowitą liczbę wierszy kodu w repozytorium. (EDYCJA: okazuje się, że mimo wszystko czegoś mi brakowało. Spójrz na komentarz orbitbota, aby uzyskać szczegółowe informacje.)

AKTUALIZACJA:

Te dane są również dostępne w interfejsie API GitHub . Napisałem więc szybki skrypt, aby pobrać dane i wykonać obliczenia:

'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

Wystarczy wkleić go we fragmencie kodu Chrome DevTools, zmienić repozytorium i kliknąć Uruchom.

Oświadczenie (dzięki lovasoa ):

Weź wyniki tej metody z odrobiną soli, ponieważ dla niektórych repozytoriów (sorich87 / bootstrap-tour) daje to wartości ujemne, co może wskazywać, że coś jest nie tak z danymi zwracanymi z API GitHub.

AKTUALIZACJA:

Wygląda na to, że ta metoda obliczania całkowitej liczby linii nie jest całkowicie niezawodna. Spójrz na komentarz orbitbot w celu uzyskania szczegółowych informacji.

Chwytak
źródło
Dobrze. Ale w niektórych przypadkach, gdy projekt jest dużym projektem społecznościowym typu open source, tego rodzaju obliczenia nie są możliwe.
franklin
@franklin Zdecydowanie. Jednak dane te są również dostępne w interfejsie API GitHub , więc możesz napisać skrypt, aby dość łatwo obliczyć całkowitą liczbę linii. Zaktualizowałem swoją odpowiedź szybkim skryptem, który właśnie napisałem.
Lewis,
Łatwiej byłoby użyć interfejsu API code_frequecy. Dawanie: 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 ... Interesujące: przetestuj swój kod na sorich87 / bootstrap-tour. Wynik jest negatywny.
lovasoa
3
@ Lewis Myślę, że nie bierzesz pod uwagę, że wiersze dodane / usunięte w jednym zatwierdzeniu mogą być takie same jak inne zatwierdzenia, na przykład podczas łączenia oddziałów itp., Które nadal liczą się do tej samej sumy. Dodatkowo, statystyki wkładów Github dla profili użytkowników są liczone tylko z domyślnej gałęzi lub stron gh, więc może być coś podobnego dla statystyk zatwierdzania / linii: help.github.com/articles/… . Zauważ też, że statystyki profilu użytkownika liczą się tylko w poprzednim roku, ale myślę, że statystyki zatwierdzeń na stronie wykresu są stałe.
orbitbot
38

Możesz sklonować tylko najnowsze zatwierdzenie za pomocą, git clone --depth 1 <url>a następnie przeprowadzić własną analizę za pomocą Linguist , tego samego oprogramowania, którego używa Github. To jedyny sposób, w jaki wiem, że dostaniesz linie kodu.

Inną opcją jest użycie interfejsu API do wyświetlenia listy języków używanych w projekcie . Nie podaje ich w wierszach, ale w bajtach. Na przykład...

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

Choć weźmy to z odrobiną soli, ten projekt obejmuje YAML i JSON, co potwierdza strona internetowa, ale API nie.

Na koniec możesz użyć wyszukiwania kodu, aby zapytać, które pliki pasują do danego języka. Ten przykład pyta, które pliki w Perl5i to Perl. https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i. Nie podadzą ci wierszy i musisz poprosić o rozmiar pliku osobno, używając zwrotu urldla każdego pliku.

Schwern
źródło
Fajnie, nie wiedziałem o tym. Czy możesz potwierdzić, że nie można tego zrobić na stronie Github?
Hubro,
Nie mogę tego potwierdzić, ale nie widzę nic w interfejsie API ani na stronie internetowej Github, które da ci wiersze. Wszystkie bajty lub procenty. Jakie jest twoje uzasadnienie dla robienia tego poprzez API zamiast klonowania?
Schwern,
Ok, dzięki za informację. Zapytam o wsparcie Github.
Hubro,
Lingwista wygląda fajnie, ale jak to zrobić, żeby pokazać ci wiersze kodu? Wygląda na to, że domyślnie wyświetla bajty, podobnie jak interfejs API.
Hubro,
@Hubro Dunno, być może będziesz musiał go załatać.
Schwern,
33

Obecnie nie jest możliwe na Github.com lub ich interfejsach API

Rozmawiałem z obsługą klienta i potwierdziłem, że nie można tego zrobić na github.com. Przekazali tę sugestię zespołowi Github, więc mam nadzieję, że będzie to możliwe w przyszłości. Jeśli tak, na pewno zedytuję tę odpowiedź.

Tymczasem odpowiedź Rory O'Kane jest doskonałą alternatywą opartą na clocpłytkim klonie repo.

Hubro
źródło
2
Nie bezpośrednio, ale ich interfejs API statystyk zawiera wszystkie dane potrzebne do ich samodzielnego obliczenia. Zobacz moją odpowiedź poniżej, aby uzyskać szybki skrypt, który to robi.
Lewis,
12

Możesz użyć GitHub API, aby uzyskać sloc podobny do poniższej funkcji

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

Osobiście zrobiłem rozszerzenie chrome, które pokazuje liczbę SLOC zarówno na liście projektów github, jak i na stronie szczegółów projektu. Możesz także ustawić swój osobisty token dostępu, aby uzyskać dostęp do prywatnych repozytoriów i ominąć limit prędkości API.

Możesz pobrać stąd https://chrome.google.com/webstore/detail/github-sloc/fkjjjamhihnjmihibcmdnianbcbccpnn

Kod źródłowy jest dostępny tutaj https://github.com/martianyi/github-sloc

Yi Kai
źródło
Jak określa się SLOC dla rozszerzenia chrome? Wszystkie typy plików? Wyklucz konkretne katalogi?
Brett Reinhard
@BrettReinhard Opiera się na liczbie dodawanych i usuwanych tygodniowo , myślę, że obejmuje wszystkie pliki.
Yi Kai
Czy to nie zwraca liczby zmian w ostatnim tygodniu?
Johannes „fish” Ziemke
@ Johannes'fish'Ziemke Nie, wraca co tydzień
Yi Kai
11

Dodatek Firefox Github SLOC

Napisałem mały dodatek do Firefoksa, który drukuje liczbę wierszy kodu na stronach projektu github: Github SLOC

lovasoa
źródło
Świetna wtyczka, bardzo pomocna! Czy wiesz, czy jest możliwe, aby działało z prywatnymi repozytoriami? Wygląda na to, że pokazuje LOC tylko w publicznych repozytoriach.
rokoko
Link jest martwy i po ręcznym wyszukiwaniu wydaje się, że niestety ta wtyczka już nie istnieje.
dCSeven,
Pojawia się prośba o udostępnienie GLOC również dla Firefoksa, a programista wydaje się otwarty na ten pomysł: github.com/artem-solovev/gloc/issues/23
miyalys
1
@miyalys Zrobione teraz: addons.mozilla.org/en-US/firefox/addon/gloc
Shachaf Zohar
7

Jeśli pytanie brzmi „czy możesz szybko uzyskać LICZBĘ LINII repozytorium github”, odpowiedź brzmi „nie”, jak podają inne odpowiedzi.

Jeśli jednak pytanie brzmi: „czy możesz szybko sprawdzić SKALĘ projektu”, zwykle oceniam projekt na podstawie jego wielkości. Oczywiście rozmiar będzie zawierał delty ze wszystkich aktywnych zatwierdzeń, ale jest to dobra miara, ponieważ rząd wielkości jest dość bliski.

Na przykład

Jak duży jest projekt „dokera”?

W przeglądarce wpisz api.github.com/repos/ORG_NAME/PROJECT_NAME, tj. Api.github.com/repos/docker/docker

W haszu odpowiedzi można znaleźć atrybut rozmiaru:

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

To powinno dać ci wyobrażenie o względnej skali projektu. Wydaje się, że liczba ta jest w KB, ale kiedy sprawdziłem ją na moim komputerze, jest ona faktycznie mniejsza, mimo że rząd wielkości jest spójny. (161432 KB = 161 MB, dok-du -s-h = 65 MB)

Jimmy Da
źródło
1
npm install sloc -g
git clone --depth 1 https://github.com/vuejs/vue/
sloc ".\vue\src" --format cli-table
rm -rf ".\vue\"

Instrukcje i objaśnienia

  1. Zainstaluj sloc z npm , narzędzia wiersza poleceń ( Node.js musi być zainstalowany).
npm install sloc -g
  1. Klon płytkie repozytorium (szybsze pobieranie niż pełny klon).
git clone --depth 1 https://github.com/facebook/react/
  1. Uruchom sloc i określ ścieżkę, którą należy przeanalizować.
sloc ".\react\src" --format cli-table

SLOC obsługuje formatowanie danych wyjściowych postaci cli-table, jak jsoni csv. Wykluczeń regularnych można używać do wykluczania plików i folderów ( dalsze informacje na temat npm ).

  1. Usuń folder repozytorium (opcjonalnie)

Powershell: rm -r -force ".\react\"lub na Mac / Unix:rm -rf ".\react\"

Zrzuty ekranu z wykonanych kroków (cli-table):

wyjście sloc jako acli-table

wyjście sloc (bez argumentów):

wyjście sloc bez argumentów

Tobi Obeck
źródło
Nie działa to dla plików R, takich jak .R lub .Rmd
jzadra,
1

Potokuj dane wyjściowe z liczby linii w każdym pliku, sortaby uporządkować pliki według liczby linii. git ls-files | xargs wc -l |sort -n

KhmerCoder
źródło
0

Otwórz terminal i uruchom następujące polecenie:

curl https://api.codetabs.com/v1/loc?github=username/reponame
ishandutta2007
źródło