GitHub deposundan kod satırı sayısını alabilir misiniz?


417

GitHub deposunda, dilde yazılmış projenin yüzdesini gösteren “dil istatistikleri” ni görebilirsiniz . Ancak, projenin kaç satır kod içerdiğini göstermez. Genellikle, bir projenin ölçeği ve karmaşıklığı hakkında hızlı bir izlenim edinmek istiyorum ve kod satırı sayısı iyi bir ilk izlenim verebilir. 500 satır kod nispeten basit bir projeyi, 100.000 satır kod çok büyük / karmaşık bir projeyi ifade eder.

Peki, çeşitli dillerde yazılmış kod satırlarını bir GitHub deposundan, tercihen klonlamadan almak mümkün müdür?


Git deposundaki satır sayısını say ” sorusu, yerel bir Git deposundaki kod satırlarının nasıl sayılacağını sorar, ancak:

  1. Muazzam olabilecek projeyi klonlamanız gerekiyor. Örneğin Wine gibi bir projeyi klonlamak uzun zaman alır.
  2. İ13n dosyaları gibi kod olması gerekmeyen dosyalardaki satırları sayacaksınız.
  3. Yalnızca (örneğin) Ruby dosyalarını sayarsanız , JavaScript gibi diğer dillerde büyük miktarda kod kaçırmanız olasıdır. Projenin hangi dilleri kullandığını önceden bilmeniz gerekir. Ayrıca, sayıyı projenin kullandığı her dil için tekrarlamanız gerekir.

Sonuç olarak, bu potansiyel olarak “bir projenin ölçeğini hızlı bir şekilde kontrol etmek” için çok fazla zaman alıcıdır.


4
@Schwern: Bunu gerçekten düşünmedim. Sanırım ana dalın son taahhüdü.
Hubro

8
@Abizern: Bu bir soruyu kapatmak için geçerli bir neden mi? Bunu kılavuzlarda bulmaya çalışıyorum . Benim planım önce SO sormak oldu. Bu işe yaramaz olsaydı, Github müşteriden destek isteyebilir ve bilgilerini burada bir cevap olarak gönderirdim.
Kasım'da Hubro

7
@Abizern: Konuya bakınız . "Programcılar tarafından sıkça kullanılan yazılım araçları" hakkında sorular sorabileceğinizi söylüyor.
Hubro

1
@Hubro 1 ile çözdüm git clone --depth 1. 2 ve 3'e gelince, sizin için analiz yapabilen bir yazılım olduğundan şüpheleniyorum ve dosya uzantılarına dayalı çok fazla tahmin yapabilirsiniz, ancak iyi bir arama ile ortaya çıkan bir zaman cehennemi yaşıyorum söz konusu yazılımı bulmak için terim. Belki başka bir soru sormalısın.
Schwern

1
Codetabs.com/count-loc/count-loc-online.html adresinde çevrimiçi bir araç var, iyi olup olmadığını denemedim.
Tgr

Yanıtlar:


298

Kabuk betiği, cloc-git

Bir uzak Git deposundaki satır sayısını tek bir komutla saymak için bu kabuk komut dosyasını kullanabilirsiniz:

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

Kurulum

Bu komut dosyasının yüklenmesi için CLOC (“Kod Satırlarını Say”) gerekir. cloc- örneğin, muhtemelen paket yöneticisi ile kurulabilir brew install clocile Homebrew . Altında yayınlanan bir liman işçisi resmimribeiro/cloc de var .

Bir dosyaya kodunu kaydederek script yükleyebilirsiniz cloc-git, çalışan chmod +x cloc-gitsenin bir klasöre dosya taşıma ardından ve $PATHgibi /usr/local/bin.

kullanım

Komut dosyası git clone, kabul edilecek herhangi bir URL olan bir bağımsız değişken alır . Örnekler https://github.com/evalEmpire/perl5i.git(HTTPS) veya git@github.com:evalEmpire/perl5i.git(SSH). Bu URL'yi herhangi bir GitHub proje sayfasından "Klonla veya indir" i tıklayarak alabilirsiniz.

Örnek çıktı:

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

Alternatifler

Komutları manuel olarak çalıştırın

Kabuk betiğini kaydetmeyi ve yüklemeyi zahmet etmek istemiyorsanız, komutları manuel olarak çalıştırabilirsiniz. Bir örnek:

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

Dilbilimci

Sonuçların GitHub'ın dil yüzdeleriyle tam olarak eşleşmesini istiyorsanız , CLOC yerine Linguist'i yüklemeyi deneyebilirsiniz . README'sine göre , koşmanız ve sonra koşmanız gerekiyor . Çalışamadım ( sayı # 2223 ).gem install linguistlinguist


6
Repoyu klonlamadan belirtilen orijinal soru.
linuxdan

12
@linuxdan Betiğim tüm repoyu klonlamıyor; --depth 1yalnızca en son taahhüdü indirmek için geçer . Çoğu depo için bu, orijinal sorunun klonlama konusundaki endişesinin çok uzun sürmesini önler.
Rory O'Kane

2
dostum, bu inanılmaz çalışıyor! her zaman merak ettim, kaç satır
kodladım

@ RoryO'Kane, repo'yu clocmakinemize (çevrimiçi olarak) klonlayarak bir github deposundaki kod satırlarını almak için kullanabiliriz . yukarıda verilen cloc-gitproje ilk satır klonları önce satır sayısı saymaya başlar
Kasun Siyambalapitiya

@KasunSiyambalapitiya Üzgünüm, clocsizin için çalışan herhangi bir çevrimiçi web sitesi bilmiyorum . clocKoddaki satırları saymak için , bilgisayarınızın bu kodu yalnızca geçici olarak indirmesi gerekir. Web tarayıcılarının bile web sayfalarını ziyaret ettiğinizde teknik olarak indirdiğini unutmayın; sadece disk yerine belleğe kaydediyorlar.
Rory O'Kane

226

Gibi bir şey çalıştırabilirsin

git ls-files | xargs wc -l

bu size toplam sayıyı verecektir →

Kod satırları

Veya bu aracı kullanın → http://line-count.herokuapp.com/


8
Sorunun kısa cevabı (github kullanarak bu numarayı bulmak) Hayır. Yaklaşmanız ikinci en iyi alternatiftir, özellikle de saymamız gereken dosyaları filtreleyebileceğimizden.
Bernard

32
Eğer filtre, örneğin Python koduna istiyorsanız: git ls-files | grep '\.py' | xargs wc -l.
Felipe SS Schneider

3
El xargsile wc -ltüm dosyaları yapıyordum sonra awksütun toplamak için kullanın , OMG bu çok daha kolay.
sdkks

1
Bu basit yaklaşım, dosyalardaki yorumları içerir. Yorumlar ve boş satırlar her zaman "kod satırları" olarak kabul edilmez.
Mark Stosberg

2
Belgelendirme, kodun büyük bir parçasıdır. Eğer yorumları atarsanız gerçekten nerede çizgi çizerdiniz. Params gibi kod bilgileri içeren yorumlar, bir sonraki satır için ESLint'i devre dışı bırakan yorumlar - ya bazı kodlardan sonra% 80 yorum yapan satırlar hakkında ne dersiniz? Bununla nereye gittiğimi görün.
Ahmad Awais

128

Genel ve özel depolar için çalışan Google Chrome tarayıcısı - GLOC için bir uzantı var .

Aşağıdakilerden bir projenin kod satırı sayısını sayar:

  • proje detay sayfası
  • kullanıcının depoları
  • organizasyon sayfası
  • arama sonuçları sayfası
  • popüler sayfa
  • sayfayı keşfet

resim açıklamasını buraya girin resim açıklamasını buraya girin resim açıklamasını buraya girin resim açıklamasını buraya girin resim açıklamasını buraya girin resim açıklamasını buraya girin resim açıklamasını buraya girin


3
özel depolar için çalışmıyor gibi gözükse de
Michail Michailidis

4
@MichailMichailidis Öneriniz için teşekkür ederiz. Ben düzeltirim.
Artem Solovev

4
@Taurus yorumum bir CR olarak değildi - kullanılabilirlik açısından, degrade işi (bahsettiğiniz nedenden dolayı) yapıyor, seçilen renklerin hayranı değilim ama bu sadece (öznel) fikrim. Şerefe :)
tech4242

2
@hellyale emin. birkaç hafta içinde
Artem Solovev

2
@hellyale Özel depolar için de çalışır. Güncelleme uzantısı. Kullanılacak daha yeni özellikler var
Artem Solovev

70

Grafikler / katkıda bulunanlar sayfasına giderseniz, repoya katkıda bulunanların bir listesini ve kaç satır eklediklerini ve kaldırdıklarını görebilirsiniz.

Bir şeyi kaçırmadıkça, tüm katılımcılar arasında eklenen toplam satır sayısından silinen toplam satır sayısının çıkarılması, repodaki toplam kod satır sayısını vermelidir. (EDIT: sonuçta bir şey eksik olduğum ortaya çıkıyor. Ayrıntılar için orbitbot'un yorumuna bir göz atın .)

GÜNCELLEME:

Bu veriler GitHub'ın API'sında da mevcuttur . Bu yüzden verileri almak ve hesaplamayı yapmak için hızlı bir komut dosyası yazdım:

'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

Bir Chrome DevTools snippet'ine yapıştırın, repoyu değiştirin ve çalıştır'ı tıklayın.

Feragatname ( lovasoa sayesinde ):

Bazı yöntemlerde (sorich87 / bootstrap-tour), negatif değerlerle sonuçlanır, bu da GitHub'ın API'sinden döndürülen verilerde bir sorun olduğunu gösterebilir.

GÜNCELLEME:

Toplam satır numaralarını hesaplamak için bu yöntemin tamamen güvenilir olmadığı anlaşılıyor. Ayrıntılar için orbitbot'un yorumuna bir göz atın .


Sağ. Ancak, projenin büyük bir açık kaynaklı topluluk projesi olduğu bazı durumlarda, bu tür bir sayı mümkün değildir.
franklin

@franklin Kesinlikle. Ancak, bu veriler GitHub'ın API'sında da mevcuttur , böylece toplam satır sayısını kolayca hesaplamak için bir komut dosyası yazabilirsiniz. Cevabımı az önce yazdığım kısa bir senaryo ile güncelledim.
Lewis,

Code_frequecy API'sini kullanmak daha kolay olurdu. Verme: 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 ... İlginç: kodunuzu sorich87 / bootstrap-tour üzerinde test edin. Sonuç olumsuzdur.
lovasoa

3
@Lewis Sanırım bir taahhütte eklenen / kaldırılan satırların, aynı toplamda sayılan şubeleri birleştirirken vb. Diğer taahhütlerle aynı olabileceğini dikkate almıyorsunuz. Ayrıca, kullanıcı profilleri için Github katkı istatistikleri yalnızca varsayılan daldan veya gh sayfalarından sayılır; bu nedenle, taahhüt / satır istatistikleri için benzer bir şey olabilir: help.github.com/articles/… . Ayrıca, kullanıcı profili istatistiklerinin yalnızca önceki yılı saydığını, ancak grafik sayfasındaki taahhüt istatistiklerinin kalıcı olduğunu düşünüyorum.
orbitbot

38

Github'un kullandığı aynı yazılım olan Linguist'i kullanarak en son taahhüdü klonlayabilir git clone --depth 1 <url>ve daha sonra kendi analizinizi yapabilirsiniz . Kod satırları alacağınızı bilmemin tek yolu bu .

Başka bir seçenek, projenin kullandığı dilleri listelemek için API'yi kullanmaktır . Onları satırlar halinde değil baytlar halinde verir. Örneğin...

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

Bir tuz tanesi ile alsa da, bu proje web sitesinin kabul ettiği ancak API'nın kabul etmediği YAML ve JSON'u içeriyor .

Son olarak, hangi dosyaların belirli bir dille eşleştiğini sormak için kod aramayı kullanabilirsiniz . Bu örnekte perl5i içindeki hangi dosyalar Perl olur. https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i. Size satır vermez ve urlher dosya için döndürülen dosyayı kullanarak dosya boyutunu ayrı ayrı sormanız gerekir .


Harika, bunu bilmiyordum. Yine de Github web sitesinde yapılamadığını teyit edebilir misiniz?
Hubro

Bunu onaylayamıyorum, ancak API'de veya Github web sitesinde size satır verecek hiçbir şey göremiyorum. Hepsi bayt veya yüzdeler. Bunu klonlama yerine API aracılığıyla yapma gerekçeniz nedir?
Schwern

Tamam, bilgi için teşekkürler. Github'dan destek isteyeceğim.
Hubro

Dilbilimci havalı görünüyor, ama yine de size kod satırlarını göstermesini nasıl sağlıyorsunuz ? Görünüşe göre tıpkı API gibi varsayılan olarak bayt gösteriyor.
Hubro

@Hubro Dunno, yama yapmanız gerekebilir.
Schwern

33

Github.com veya API'larında şu anda mümkün değil

Müşteri desteğiyle konuştum ve bunun github.com'da yapılamadığını doğruladım. Ancak öneriyi Github ekibine ilettiler, umarım gelecekte mümkün olacak. Öyleyse, bu yanıtı düzenlediğinizden emin olacağım.

Bu arada Rory O'Kane'in cevabı , mükemmel bir alternatif clocve sığ bir repo klonuna dayanıyor .


2
Doğrudan değil, ancak İstatistik API'leri , kendiniz hesaplamak için ihtiyacınız olan tüm verilere sahiptir. Bkz Cevabımı yapar hızlı bir komut dosyası için aşağıda.
Lewis,

12

Aşağıdaki işlev gibi slocayı almak için GitHub API'sini kullanabilirsiniz.

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

Şahsen hem github proje listesinde hem de proje detay sayfasında SLOC sayısını gösteren bir krom uzantısı yaptım. Kişisel erişim simgenizi özel depolara erişmek ve API ücreti sınırını atlamak için de ayarlayabilirsiniz.

Buradan https://chrome.google.com/webstore/detail/github-sloc/fkjjjamhihnjmihibcmdnianbcbccpnn adresinden indirebilirsiniz.

Kaynak kodu burada bulunabilir https://github.com/martianyi/github-sloc


Krom uzantısı için SLOC nasıl belirlenir? Tüm dosya türleri? Belirli dizinler hariç tutulsun mu?
Brett Reinhard

@BrettReinhard Hafta başına ekleme ve silme sayısına dayanıyor, bence tüm dosyaları içeriyor.
Yi Kai

Bu sadece geçen haftaki değişikliklerin sayısını döndürmüyor mu?
Johannes 'balık' Ziemke

@ Johannes'fish'Ziemke Hayır, her hafta geri dönüyor
Yi Kai

11

Firefox eklentisi Github SLOC

Github proje sayfalarındaki kod satırlarının sayısını yazdıran küçük bir firefox eklentisi yazdım: Github SLOC


Büyük eklenti, çok yararlı! Özel depolarla çalışmasının mümkün olup olmadığını biliyor musunuz? Sadece kamusal depolarda LOC gösteriliyor gibi görünüyor.
rococo

Bağlantı öldü ve manuel olarak aradıktan sonra, ne yazık ki bu eklenti artık mevcut değil gibi görünüyor.
dCSeven

GLOC'u Firefox için de kullanılabilir hale getirmek için bir talep var ve geliştirici şu fikre açık görünüyor: github.com/artem-solovev/gloc/issues/23
miyalys


7

Eğer soru " hızlıca bir github repo SAYISI alabilir miyim " ise, cevap diğer cevaplarda belirtildiği gibi hayır.

Ancak, soru " bir projenin ÖLÇEĞİNİ hızlı bir şekilde kontrol edebilir misiniz?" İse, genellikle bir projeye büyüklüğüne bakarak ölçerim. Tabii ki boyut tüm aktif taahhütlerin deltalarını içerecektir, ancak büyüklük sırası oldukça yakın olduğu için iyi bir metriktir.

Örneğin

"Liman işçisi" projesi ne kadar büyük?

Tarayıcınıza api.github.com/repos/ORG_NAME/PROJECT_NAME yani api.github.com/repos/docker/docker adresini girin

Yanıt karma değerinde size niteliğini bulabilirsiniz:

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

Bu size projenin göreceli ölçeği hakkında bir fikir vermelidir. Sayı KB olarak görünüyor, ancak bilgisayarımda kontrol ettiğimde, büyüklük sırası tutarlı olsa bile, aslında daha küçük. (161432KB = 161MB, du -s -h liman işçisi = 65MB)


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

Talimatlar ve Açıklama

  1. NPM gelen SLOC takın , bir komut satırı aracı ( node.js kurulması gerekir).
npm install sloc -g
  1. Sığ depoyu klonlayın (tam klondan daha hızlı indirme).
git clone --depth 1 https://github.com/facebook/react/
  1. Sloc'u çalıştırın ve analiz edilmesi gereken yolu belirtin.
sloc ".\react\src" --format cli-table

sloc, çıktının a cli-table, jsonveya olarak biçimlendirilmesini destekler csv. Dosya ve klasörleri hariç tutmak için düzenli ifadeler kullanılabilir ( npm hakkında daha fazla bilgi ).

  1. Havuz klasörünü sil (isteğe bağlı)

Powershell: rm -r -force ".\react\"veya Mac / Unix'te:rm -rf ".\react\"

Yürütülen adımların ekran görüntüleri (cli-tablo):

acli-table olarak sloc çıkışı

sloc çıktısı (bağımsız değişken yok):

argümansız sloc çıktısı


Bu .R veya .Rmd gibi R dosyaları için çalışmalarına görünmüyor
jzadra

1

sortDosyaları satır sayısına göre düzenlemek için her dosyadaki satır sayısının çıktısını ekleyin. git ls-files | xargs wc -l |sort -n



0

Terminali açın ve aşağıdakileri çalıştırın:

curl https://api.codetabs.com/v1/loc?github=username/reponame
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.