Come fa GitHub a capire la lingua di un progetto?


84

Recentemente stavo lavorando a un progetto GitHub sia in JavaScript che in C ++ e ho notato che GitHub ha etichettato il progetto come C ++. Se devi scegliere una singola lingua, questa è probabilmente la designazione corretta poiché il codice C ++ è compilato come una libreria JavaScript, ma questo mi ha fatto chiedere ... come fa github a capire quale lingua taggare ogni progetto?


14
Puoi considerarti fortunato. Sto scrivendo un progetto Ruby on Rails ma poiché sto usando Twitter Bootstrap, Github pensa che il mio progetto sia Javascript, invece del Ruby previsto

2
@davblayn Penso che github.com/github/linguist/blob/master/lib/linguist/vendor.yml risolverebbe il tuo problema. Anche l'utilizzo di un CDN per bootstrap funzionerebbe.
Eric Wilson

3
Questa domanda sembra essere fuori tema perché non riguarda la programmazione. Vedi Quali argomenti posso chiedere qui nel Centro assistenza. Forse Web Apps Stack Exchange sarebbe un posto migliore per chiedere.
jww

Vedi anche Tag errato della lingua sul tracker di Github per Linguist .
jww

1
Puoi dire al motore di statistica bugie sui tipi di file per confondere il risultato. Vedi stackoverflow.com/a/27099628/492
CAD bloke

Risposte:


81

Aggiornamento aprile 2013, da nuclearsandwich (team di supporto GitHub o "supportocat"):

Se la lingua desiderata non riceve l'evidenziazione della sintassi, puoi contribuire alla libreria Linguist per aggiungerla.


(Risposta originale, ottobre 2012)

Questo thread sul supporto GitHub lo spiega:

Riassume solo le dimensioni dei file per ciascuna estensione. Quello più grande "vince".

Vorremmo evitare di aprire i file e analizzare il loro contenuto, poiché entrambi rallenterebbero il processo ... ma questo potrebbe essere l'unico metodo per risolvere conflitti come questo.

Poiché questo non è accurato al 100%, alcuni hanno aggiunto:

Anch'io voterei per un semplice interruttore di esclusione manuale per i casi in cui l'ipotesi è sbagliata.


Nota: come Mark Rushakoff menziona nella sua risposta (votata positivamente), le supposizioni sono migliorate da allora con il progetto linguista (open source da giugno 2011).
Puoi vedere che ci sono ancora problemi: GitHub Linguist Issues .
Vedi qui per maggiori dettagli :

Una volta che la lingua è stata rilevata, viene passata ad Albino , un wrapper di Pygments , che esegue l'effettiva evidenziazione della sintassi.

È inoltre possibile aggiungere direttive linguistiche in un file .gitattributes .


2
Grazie per le informazioni. Immagino che non sia ancora possibile modificare la lingua manualmente.
noob

Non è più così! Le risposte seguenti per quanto riguarda il linguista sono più vicine al segno. Controlla Il mio repository è contrassegnato come lingua sbagliata e perché la mia lingua preferita non viene riconosciuta su help.github.com . Dichiarazione di non responsabilità: lavoro nel team di supporto di GitHub.
nuclearsandwich

@nuclearsandwich Eccellente, ho aggiornato la risposta, completando la tua modifica. Nota: sarò presso la sede di GitHub venerdì 10 maggio, incontro con John Greet e altri
supporti gatti

Voglio solo aggiungere che non contrassegnare il repository o lasciare che l'utente scelga la lingua principale sarebbe molto più conveniente che indovinare automaticamente, perché il mio repository github.com/salda/file_scraper è principalmente in C ++ con un po 'di C, ma contrassegnato come 70 % Obiettivo-C.
Lukas Salich


4

Innanzitutto, sappi che puoi sovrascrivere la lingua rilevata per i file nel tuo repository utilizzando le sostituzioni di Linguist .

Ora, in poche parole,

  1. Ogni repository è contrassegnato con la prima lingua dalle statistiche della lingua .
  2. Le statistiche del linguaggio contano la dimensione totale dei file per ogni linguaggio di programmazione o markup rilevato. Venduti, documentazione e file generati non vengono conteggiati.
  3. La lingua di ogni file viene rilevata dal progetto open source Linguist .

In che modo Linguist rileva le lingue?

Linguist fa affidamento sulle seguenti strategie , in ordine, e restituisce la lingua non appena ha trovato una corrispondenza perfetta (viene restituita la strategia con una sola lingua).

  1. Cerca le modeline Emacs e Vim .
  2. Nome file noto. Alcuni nomi di file sono associati a lingue specifiche (pensa Makefile).
  3. Cerca uno shebang. Un file con uno #!/bin/bashshebang sarà classificato come Shell.
  4. Estensione file nota. Le lingue hanno una serie di estensioni associate ad esse. Tuttavia, ci sono molti conflitti con questa strategia. I risultati contrastanti (si pensi a C ++, C e Objective-C per .h) vengono perfezionati dalle strategie successive.
  5. Un insieme di regole euristiche . Di solito si basano su espressioni regolari sul contenuto dei file per cercare di identificare la lingua (ad esempio, ^[^#]+:-per Prolog ).
  6. Un classificatore bayesiano ingenuo addestrato su file di esempio . Ultima strategia, minima precisione. Il classificatore bayesiano accetta sempre un sottoinsieme di lingue come input; non ha lo scopo di classificare tra tutte le lingue. Viene restituita la migliore corrispondenza trovata dal classificatore.

Cosa sono i file non venduti e i file di documentazione?

Linguist considera alcuni file come venduti , nel senso che non sono inclusi nelle statistiche linguistiche. Questi includono librerie di terze parti come jQuery e sono definiti nel vendor.ymlfile di configurazione. Puoi anche vendere o vendere file nel tuo repository utilizzando le sostituzioni di Linguist .

Allo stesso modo, i file di documentazione sono definiti documentation.ymle possono essere modificati utilizzando le sostituzioni di Linguist .

Come vengono rilevati i file generati?

Linguist si basa su semplici regole per rilevare i file generati, utilizzando sia i percorsi che il contenuto dei file. I file generati non vengono conteggiati nelle statistiche della lingua e non vengono visualizzati nelle differenze su github.com.

E i linguaggi di programmazione e markup?

In Linguist, a ogni lingua viene assegnato un tipo. Questi tipi possono essere trovati nel file di configurazione principale, languages.yml. Nelle statistiche vengono conteggiati solo i linguaggi di programmazione e markup.


0

Dopo aver armeggiato con il linguista l' ho notato.

Per i file con uno Shebang , lo Shebang viene preso in considerazione quando si determina la lingua ma sembra essere ponderato in modo uniforme rispetto ad altri token . Questo sembra essere un grosso errore perché lo Shebang dovrebbe definire definitivamente la lingua del file.

Ciò può causare problemi con l'evidenziazione.


Questa risposta ha diversi collegamenti interrotti. Questo vale anche per questa risposta come appare sullo stack exchange: webapps.stackexchange.com/a/40110 . Peccato, perché mi piacerebbe guardare quei link!
shmim

-1

Le estensioni dei file sono la prima cosa che mi viene in mente.


Certo, ma ... il mio progetto conteneva sia .jse .ccfile, tra le altre estensioni.
Justin Ethier
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.