Bisakah Anda mendapatkan jumlah baris kode dari repositori GitHub?

417

Dalam repositori GitHub Anda dapat melihat "statistik bahasa", yang menampilkan persentase proyek yang ditulis dalam bahasa. Namun, itu tidak menampilkan berapa banyak baris kode proyek terdiri dari. Seringkali, saya ingin dengan cepat mendapatkan kesan tentang skala dan kompleksitas suatu proyek, dan jumlah baris kode dapat memberikan kesan pertama yang baik. 500 baris kode menyiratkan proyek yang relatif sederhana, 100.000 baris kode menyiratkan proyek yang sangat besar / rumit.

Jadi, apakah mungkin untuk mendapatkan baris kode yang ditulis dalam berbagai bahasa dari repositori GitHub, lebih disukai tanpa mengkloningnya?


Pertanyaan “ Hitung jumlah baris dalam repositori git ” menanyakan bagaimana cara menghitung baris kode dalam repositori Git lokal, tetapi:

  1. Anda harus mengkloning proyek, yang bisa sangat besar. Mengkloning proyek seperti Wine, misalnya, membutuhkan waktu lama.
  2. Anda akan menghitung baris dalam file yang tidak harus berupa kode, seperti file i13n.
  3. Jika Anda menghitung hanya (misalnya) file Ruby, Anda berpotensi kehilangan sejumlah besar kode dalam bahasa lain, seperti JavaScript. Anda harus tahu sebelumnya bahasa yang digunakan proyek. Anda juga harus mengulangi penghitungan untuk setiap bahasa yang digunakan proyek.

Secara keseluruhan, ini berpotensi terlalu banyak waktu untuk “memeriksa skala proyek” dengan cepat.

Hubro
sumber
4
@ Schwern: Tidak terlalu memikirkan itu. Komit terbaru dari cabang utama, saya kira.
Hubro
8
@ Ambizern: Apakah itu alasan yang sah untuk menutup pertanyaan? Saya mencoba menemukan itu dalam pedoman . Rencana saya adalah bertanya dulu pada SO. Jika itu terbukti sia-sia, saya akan meminta dukungan pelanggan Github dan memposting informasi mereka sebagai jawaban di sini.
Hubro
7
@Abizern: Lihat pada topik . Dikatakan Anda dapat mengajukan pertanyaan tentang "perangkat lunak yang biasa digunakan oleh pemrogram".
Hubro
1
@Ubro 1 Saya sudah menyelesaikannya git clone --depth 1. Adapun 2 dan 3, saya curiga ada perangkat lunak di luar sana yang dapat melakukan analisis untuk Anda, dan Anda dapat melakukan banyak tebakan berdasarkan ekstensi file, tapi saya punya banyak waktu dengan pencarian yang bagus istilah untuk menemukan perangkat lunak tersebut. Mungkin Anda perlu bertanya pertanyaan lain.
Schwern
1
Ada alat online di codetabs.com/count-loc/count-loc-online.html , belum mencoba jika ada gunanya.
Tgr

Jawaban:

298

Skrip shell, cloc-git

Anda dapat menggunakan skrip shell ini untuk menghitung jumlah baris dalam repositori Git jarak jauh dengan satu perintah:

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

Instalasi

Script ini membutuhkan CLOC ("Count Lines of Code") untuk diinstal. clocmungkin dapat diinstal dengan manajer paket Anda - misalnya, brew install clocdengan Homebrew . Ada juga gambar buruh pelabuhan yang diterbitkan di bawahmribeiro/cloc .

Anda dapat menginstal skrip dengan menyimpan kodenya ke file cloc-git, menjalankan chmod +x cloc-git, dan kemudian memindahkan file ke folder $PATHseperti Anda /usr/local/bin.

Pemakaian

Script mengambil satu argumen, yaitu URL apa saja yang git cloneakan menerima. Contohnya adalah https://github.com/evalEmpire/perl5i.git(HTTPS) atau [email protected]:evalEmpire/perl5i.git(SSH). Anda bisa mendapatkan URL ini dari halaman proyek GitHub dengan mengklik "Kloning atau unduh".

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

Alternatif

Jalankan perintah secara manual

Jika Anda tidak ingin repot menyimpan dan menginstal skrip shell, Anda dapat menjalankan perintah secara manual. Sebuah contoh:

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

Ahli bahasa

Jika Anda ingin hasilnya sesuai dengan persentase bahasa GitHub dengan tepat, Anda dapat mencoba menginstal Linguist alih-alih CLOC . Menurut README-nya , Anda harus gem install linguistmenjalankannya linguist. Saya tidak bisa menjalankannya ( edisi # 2223 ).

Rory O'Kane
sumber
6
Pertanyaan asli ditentukan tanpa mengkloning repo.
linuxdan
12
@linuxdan Skrip saya tidak mengkloning seluruh repo; ini --depth 1hanya berlaku untuk mengunduh komit terbaru. Untuk sebagian besar repo, ini menghindari kekhawatiran pertanyaan awal tentang kloning terlalu lama.
Rory O'Kane
2
***, ini bekerja luar biasa! selalu bertanya-tanya, berapa banyak baris yang saya kodekan)
Anatoly Yakimchuk
@ RoryO'Kane dapat kita gunakan clocuntuk mendapatkan baris kode di repositori github tanpa mengkloning repo ke mesin kita (melalui online). di atas diberikan cloc-gitjuga klon pertama untuk memproyeksikan sebelum mulai menghitung no of lines
Kasun Siyambalapitiya
@KasunSiyambalapitiya Maaf, saya tidak tahu ada situs web online yang berjalan clocuntuk Anda. Agar clocdapat menghitung baris dalam kode, komputer Anda harus mengunduh kode itu, meskipun hanya sementara. Perhatikan bahwa bahkan browser web secara teknis mengunduh halaman web ketika Anda mengunjunginya; mereka hanya menyimpannya ke memori, bukan ke disk.
Rory O'Kane
226

Anda dapat menjalankan sesuatu seperti

git ls-files | xargs wc -l

yang akan memberi Anda jumlah total →

baris kode

Atau gunakan alat ini → http://line-count.herokuapp.com/

Ahmad Awais
sumber
8
Jawaban singkat untuk pertanyaan (menemukan nomor ini menggunakan github) adalah Tidak. Pendekatan Anda adalah alternatif terbaik kedua, khususnya karena kami dapat menyaring file apa pun yang perlu kami hitung.
Bernard
32
Jika Anda ingin filter, misalnya, kode Python: git ls-files | grep '\.py' | xargs wc -l.
Felipe SS Schneider
3
Saya lakukan xargsuntuk wc -lsemua file secara manual kemudian gunakan awkuntuk menjumlahkan kolom, OMG ini jauh lebih mudah.
sdkks
1
Pendekatan sederhana ini mencakup komentar dalam file. Komentar dan baris kosong tidak selalu dianggap "baris kode".
Mark Stosberg
2
Dokumentasi adalah bagian besar dari kode. Di mana Anda akan menarik garis benar-benar jika Anda mengeluarkan komentar. Bagaimana dengan komentar yang berisi info kode seperti params, bagaimana dengan komentar yang menonaktifkan ESLint untuk baris berikutnya - bagaimana dengan baris yang 80% komentar setelah beberapa kode. Lihat ke mana saya pergi dengan ini.
Ahmad Awais
129

Ada ekstensi untuk browser Google Chrome - GLOC yang berfungsi untuk repo publik dan pribadi.

Menghitung jumlah baris kode proyek dari:

  • halaman detail proyek
  • repositori pengguna
  • halaman organisasi
  • halaman hasil pencarian
  • halaman tren
  • jelajahi halaman

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Artem Solovev
sumber
3
dibatalkan meskipun tampaknya tidak bekerja untuk repositori pribadi
Michail Michailidis
4
@MichailMichailidis Terima kasih atas saran Anda. Saya akan memperbaikinya.
Artem Solovev
4
@ Taurus komentar saya tidak dimaksudkan sebagai CR - dari sudut pandang kegunaan gradien melakukan pekerjaan (untuk alasan yang Anda sebutkan) Saya maksudkan bahwa saya bukan penggemar warna yang dipilih tapi itu hanya pendapat (subjektif) saya. Cheers :)
tech4242
2
@ Halo, tentu saja. dalam beberapa minggu
Artem Solovev
2
@ Hellyale Ini bekerja untuk repo pribadi juga. Perbarui ekstensi. Ada lebih banyak fitur baru untuk digunakan
Artem Solovev
70

Jika Anda pergi ke halaman grafik / kontributor, Anda dapat melihat daftar semua kontributor pada repo dan berapa banyak baris yang telah ditambahkan dan dihapus.

Kecuali jika saya melewatkan sesuatu, mengurangi jumlah garis agregat yang dihapus dari jumlah garis agregat yang ditambahkan di antara semua kontributor harus menghasilkan jumlah total baris kode dalam repo. (EDIT: ternyata aku kehilangan sesuatu. Lihat komentar orbitbot untuk lebih jelasnya.)

MEMPERBARUI:

Data ini juga tersedia di API GitHub . Jadi saya menulis skrip cepat untuk mengambil data dan melakukan perhitungan:

'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

Cukup tempel di cuplikan Chrome DevTools, ubah repo dan klik jalankan.

Penafian (terima kasih kepada lovasoa ):

Ambil hasil dari metode ini dengan sebutir garam, karena untuk beberapa repo (sorich87 / bootstrap-tour) menghasilkan nilai negatif, yang mungkin mengindikasikan ada yang salah dengan data yang dikembalikan dari API GitHub.

MEMPERBARUI:

Sepertinya metode ini untuk menghitung jumlah garis total tidak sepenuhnya dapat diandalkan. Lihatlah komentar orbitbot untuk detailnya.

Lewis
sumber
Baik. Tetapi dalam beberapa kasus di mana proyek ini adalah proyek komunitas open-source yang besar, perhitungan semacam ini tidak layak.
franklin
@ Franklin Pasti. Namun, data ini juga tersedia di API GitHub , sehingga Anda dapat menulis skrip untuk menghitung jumlah baris dengan cukup mudah. Saya memperbarui jawaban saya dengan skrip cepat yang baru saja saya tulis.
Lewis
Akan lebih mudah menggunakan API code_frequecy. Memberi: 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 ... Menarik: uji kode Anda di sorich87 / bootstrap-tour. Hasilnya negatif.
lovasoa
3
@Lewis Saya pikir Anda mengabaikan bahwa baris ditambahkan / dihapus dalam satu komit bisa sama dengan komit lainnya, fe ketika menggabungkan cabang dll yang masih dihitung terhadap total yang sama. Selain itu, statistik statistik kontribusi Github untuk profil pengguna hanya dihitung dari cabang standar atau halaman gh, jadi mungkin ada sesuatu yang serupa terjadi untuk statistik komit / baris: help.github.com/articles/… . Juga perhatikan bahwa statistik profil pengguna hanya menghitung tahun sebelumnya, tapi saya pikir statistik komit pada halaman grafik adalah permanen.
orbitbot
38

Anda dapat mengkloning hanya komit terbaru menggunakan git clone --depth 1 <url>dan kemudian melakukan analisis Anda sendiri menggunakan Linguist , perangkat lunak yang sama yang digunakan Github. Itulah satu-satunya cara saya tahu Anda akan mendapatkan garis kode.

Pilihan lain adalah menggunakan API untuk membuat daftar bahasa yang digunakan proyek . Itu tidak memberi mereka dalam garis tetapi dalam byte. Sebagai contoh...

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

Meskipun mengambil itu dengan sebutir garam, proyek itu termasuk YAML dan JSON yang diakui situs web tetapi API tidak.

Terakhir, Anda dapat menggunakan pencarian kode untuk menanyakan file mana yang cocok dengan bahasa yang diberikan. Contoh ini menanyakan file mana di perl5i yang Perl. https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i. Itu tidak akan memberi Anda baris, dan Anda harus meminta ukuran file secara terpisah menggunakan yang dikembalikan urluntuk setiap file.

Schwern
sumber
Keren, tidak tahu tentang itu. Bisakah Anda mengonfirmasi bahwa itu tidak dapat dilakukan di situs web Github?
Hubro
Saya tidak dapat mengonfirmasinya, tetapi saya tidak melihat apa pun di API atau di situs web Github yang akan memberi Anda baris. Itu semua byte atau persentase. Apa alasan Anda melakukannya melalui API alih-alih kloning?
Schwern
Ok, terima kasih atas informasinya. Saya akan meminta dukungan Github.
Hubro
Ahli bahasa terlihat keren, tetapi bagaimana Anda membuatnya menunjukkan kepada Anda baris kode? Sepertinya ini menunjukkan byte secara default, sama seperti API.
Hubro
@Hubro Entah, Anda mungkin harus menambalnya.
Schwern
33

Saat ini tidak memungkinkan di Github.com atau API-nya

Saya telah berbicara dengan dukungan pelanggan dan mengonfirmasi bahwa ini tidak dapat dilakukan di github.com. Mereka telah menyampaikan saran tersebut kepada tim Github, jadi mudah-mudahan itu akan mungkin terjadi di masa depan. Jika demikian, saya pasti akan mengedit jawaban ini.

Sementara itu, jawaban Rory O'Kane adalah alternatif brilian berdasarkan clocdan klon repo dangkal.

Hubro
sumber
2
Tidak secara langsung, tetapi API Statistik mereka memiliki semua data yang Anda butuhkan untuk menghitungnya sendiri. Lihat jawaban saya di bawah untuk skrip cepat yang melakukan ini.
Lewis
12

Anda dapat menggunakan GitHub API untuk mendapatkan sloc seperti fungsi berikut

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

Secara pribadi saya membuat ekstensi chrome yang menunjukkan jumlah SLOC pada daftar proyek github dan halaman detail proyek. Anda juga dapat mengatur token akses pribadi Anda untuk mengakses repositori pribadi dan melewati batas laju api.

Anda dapat mengunduh dari sini https://chrome.google.com/webstore/detail/github-sloc/fkjjjjamhihnjmihibcmdnianbcbccpnn

Kode sumber tersedia di sini https://github.com/martianyi/github-sloc

Yi Kai
sumber
Untuk ekstensi chrome, bagaimana SLOC ditentukan? Semua jenis file? Kecualikan direktori tertentu?
Brett Reinhard
@ BrettReinhard Ini didasarkan pada jumlah penambahan dan penghapusan per minggu , saya pikir itu termasuk semua file.
Yi Kai
Bukankah itu hanya mengembalikan jumlah perubahan dalam seminggu terakhir?
Johannes 'fish' Ziemke
@ Johannes'fish'Ziemke Tidak, ini kembali setiap minggu
Yi Kai
11

Pengaya Firefox Github SLOC

Saya menulis addon firefox kecil yang mencetak jumlah baris kode pada halaman proyek github: Github SLOC

lovasoa
sumber
Plugin hebat, sangat membantu! Apakah Anda tahu apakah mungkin membuatnya bekerja dengan repo pribadi? Tampaknya hanya menunjukkan LOC di repo publik.
rococo
Tautannya sudah mati dan setelah mencari secara manual, tampaknya, sayangnya plugin ini tidak ada lagi.
dCSeven
Ada permintaan untuk membuat GLOC tersedia untuk Firefox juga, dan pengembang tampaknya terbuka untuk ide: github.com/artem-solovev/gloc/issues/23
miyalys
1
@miyalys Sudah selesai sekarang: addons.mozilla.org/en-US/firefox/addon/gloc
Shachaf Zohar
7

Jika pertanyaannya adalah "dapatkah Anda dengan cepat mendapatkan JUMLAH LINI dari repo github", jawabannya tidak seperti yang dinyatakan oleh jawaban lain.

Namun, jika pertanyaannya "bisakah Anda cepat memeriksa SKALA proyek", saya biasanya mengukur proyek dengan melihat ukurannya. Tentu saja ukurannya akan mencakup delta dari semua commit aktif, tetapi ini adalah metrik yang baik karena urutan besarnya cukup dekat.

Misalnya

Seberapa besar proyek "buruh pelabuhan"?

Di browser Anda, masukkan api.github.com/repos/ORG_NAME/PROJECT_NAME yaitu api.github.com/repos/docker/docker

Di hash respons, Anda dapat menemukan atribut ukuran:

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

Ini akan memberi Anda gambaran tentang skala relatif proyek. Jumlahnya tampaknya dalam KB, tetapi ketika saya memeriksanya di komputer saya itu sebenarnya lebih kecil, meskipun urutan besarnya konsisten. (161432KB = 161MB, du-s -h buruh pelabuhan = 65MB)

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

Instruksi dan Penjelasan

  1. Instal sloc dari npm , alat baris perintah ( Node.js perlu diinstal).
npm install sloc -g
  1. Klon repositori dangkal (unduhan lebih cepat dari klon penuh).
git clone --depth 1 https://github.com/facebook/react/
  1. Jalankan sloc dan tentukan path yang harus dianalisis.
sloc ".\react\src" --format cli-table

sloc mendukung pemformatan output sebagai cli-table,, jsonatau csv. Ekspresi reguler dapat digunakan untuk mengecualikan file dan folder ( Informasi lebih lanjut tentang npm ).

  1. Hapus folder repositori (opsional)

Powershell: rm -r -force ".\react\"atau di Mac / Unix:rm -rf ".\react\"

Cuplikan layar dari langkah-langkah yang dieksekusi (cli-table):

output sloc sebagai acli-table

output sloc (tidak ada argumen):

output sloc tanpa argumen

Tobi Obeck
sumber
Tampaknya ini tidak berfungsi untuk file R seperti .R atau .Rmd
jzadra
1

Pipa keluaran dari jumlah baris di setiap file ke sortuntuk mengatur file dengan jumlah baris. git ls-files | xargs wc -l |sort -n

KhmerCoder
sumber
0

Buka terminal dan jalankan yang berikut:

curl https://api.codetabs.com/v1/loc?github=username/reponame
ishandutta2007
sumber