Wie findet Github die Sprache eines Projekts heraus?

84

Ich habe kürzlich an einem Github-Projekt in JavaScript und C ++ gearbeitet und festgestellt, dass Github das Projekt als C ++ markiert hat. Wenn Sie eine einzelne Sprache auswählen müssen, ist dies wahrscheinlich die richtige Bezeichnung, da der C ++ - Code als JavaScript-Bibliothek kompiliert ist. Ich habe mich jedoch gefragt, wie Github herausfindet, in welcher Sprache jedes Projekt markiert werden soll.

Justin Ethier
quelle
14
Sie können sich glücklich schätzen. Ich schreibe ein Ruby on Rails-Projekt, aber da ich Twitter Bootstrap verwende, glaubt Github, dass mein Projekt Javascript ist, anstelle des beabsichtigten Ruby
2
@davblayn Ich denke, dass github.com/github/linguist/blob/master/lib/linguist/vendor.yml Ihr Problem lösen würde. Auch die Verwendung eines CDN für den Bootstrap würde funktionieren.
Eric Wilson
3
Diese Frage scheint nicht zum Thema zu gehören, da es nicht um Programmierung geht. Weitere Informationen zu diesen Themen finden Sie hier in der Hilfe. Vielleicht ist Web Apps Stack Exchange ein besserer Ort, um zu fragen.
JWW
Siehe auch Tag " Misidentified Language" im Github-Tracker für Linguist .
JWW
1
Sie können der Statistik-Engine Lügen über Dateitypen mitteilen, um das Ergebnis zu verfälschen. Siehe stackoverflow.com/a/27099628/492
CAD-

Antworten:

81

Update April 2013 von nuclearsandwich (GitHub-Supportteam oder "supportocat"):

Wenn Ihre gewünschte Sprache keine Syntaxhervorhebung erhält, können Sie einen Beitrag zur Linguist-Bibliothek leisten, um sie hinzuzufügen.


(Ursprüngliche Antwort, Oktober 2012)

Dieser Thread zur GitHub-Unterstützung erklärt es:

Es werden nur die Dateigrößen für jede Erweiterung zusammengefasst. Größter "gewinnt".

Wir möchten vermeiden, Dateien zu öffnen und ihren Inhalt zu analysieren, da dies den Prozess verlangsamen würde. Dies ist jedoch möglicherweise die einzige Methode zur Lösung von Konflikten wie diesem.

Da dies nicht 100% genau ist, hatte dies einige dazu veranlasst, Folgendes hinzuzufügen:

Auch ich würde für die Fälle, in denen die Vermutung falsch ist, für einen einfachen manuellen Übersteuerungsschalter stimmen.


Hinweis: Wie Mark Rushakoff in seiner Antwort erwähnt (positiv bewertet), wurde die Vermutung seitdem mit dem Linguist-Projekt (Open-Source ab Juni 2011) besser .
Sie können jedoch sehen, dass es immer noch Probleme gibt: Probleme mit GitHub Linguist .
Sehen Sie hier für weitere Details :

Sobald die Sprache erkannt wurde, wird sie an Albino übergeben , einen Pylements- Wrapper, der die eigentliche Syntaxhervorhebung vornimmt .

Außerdem können Sie einer .gitattributes-Datei Sprachanweisungen hinzufügen .

VonC
quelle
2
Danke für die Information. Ich denke, es gibt immer noch keine Möglichkeit, die Sprache manuell zu ändern.
Noob
Dies ist nicht mehr der Fall! Die folgenden Antworten zum Sprachwissenschaftler sind näher an der Marke. Check out ist mein Repository als die falsche Sprache markiert und Warum ist nicht meine Lieblingssprache anerkannt auf help.github.com . Haftungsausschluss: Ich arbeite im Support-Team von GitHub.
Nuclearsandwich
@nuclearsandwich Ausgezeichnet, ich habe die Antwort aktualisiert und Ihre Bearbeitung abgeschlossen. Hinweis: Ich werde am Freitag, dem 10. Mai, im GitHub-Hauptquartier sein und mich mit John Greet und anderen Supportocats treffen :)
VonC
Ich möchte nur hinzufügen, dass es viel bequemer wäre, das Repository nicht zu markieren oder den Benutzer die Hauptsprache auswählen zu lassen, als automatisch zu raten, da mein Repository github.com/salda/file_scraper hauptsächlich in C ++ mit etwas C ist, aber als 70 markiert ist % Ziel c.
Lukas Salich
13

Derzeit Github des Linguist Projekt ist , was verwendet wird Sprache Statistiken , um zu bestimmen, wie beschrieben in dieser Github Blog - Post (die kam ein paar Monate, nachdem diese Frage ursprünglich gefragt wurde).

Mark Rushakoff
quelle
Ausgezeichnet, ich habe es zum Zeitpunkt meiner Antwort nicht gesehen. +1
VonC
4

Stellen Sie zunächst fest, dass Sie die für Dateien in Ihrem Repository erkannte Sprache mithilfe von Linguist-Überschreibungen überschreiben können .

Nun, kurz gesagt,

  1. Jedes Repository ist mit der ersten Sprache aus der Sprachstatistik versehen .
  2. Sprachstatistiken zählen die Gesamtgröße der Dateien für jede erkannte Programmier- oder Auszeichnungssprache. Liefer-, Dokumentations- und generierte Dateien werden nicht gezählt.
  3. Die Sprache jeder Datei wird vom Open Source-Projekt Linguist erkannt .

Wie erkennt der Linguist Sprachen?

Der Linguist verlässt sich der Reihe nach auf die folgenden Strategien und gibt die Sprache zurück, sobald eine perfekte Übereinstimmung gefunden wurde (Strategie mit einer einzigen zurückgegebenen Sprache).

  1. Suchen Sie nach Emacs- und Vim-Modellen .
  2. Bekannter Dateiname. Einige Dateinamen sind bestimmten Sprachen zugeordnet (denken Sie daranMakefile ).
  3. Suchen Sie nach einem Schebang. Eine Akte mit einem #!/bin/bashSchebang wird als Shell klassifiziert.
  4. Bekannte Dateierweiterung. Sprachen sind eine Reihe von Erweiterungen zugeordnet. Es gibt jedoch viele Konflikte mit dieser Strategie. Die widersprüchlichen Ergebnisse (denken Sie an C ++, C und Objective-C für .h) werden durch die nachfolgenden Strategien verfeinert.
  5. Eine Reihe heuristischer Regeln . Sie verlassen sich normalerweise auf reguläre Ausdrücke über den Inhalt von Dateien, um die Sprache zu identifizieren (z. B. ^[^#]+:-für Prolog ).
  6. Ein naiver Bayes'scher Klassifikator, der auf Beispieldateien trainiert wurde . Letzte Strategie, niedrigste Genauigkeit. Der Bayes'sche Klassifikator verwendet immer eine Teilmenge von Sprachen als Eingabe. Es ist nicht dazu gedacht, unter allen Sprachen zu klassifizieren. Die beste vom Klassifizierer gefundene Übereinstimmung wird zurückgegeben.

Was sind nicht verkaufte und Dokumentationsdateien?

Der Linguist betrachtet einige Dateien als verkauft , was bedeutet , dass sie nicht in der Sprachstatistik enthalten sind. Dazu gehören Bibliotheken von Drittanbietern wie jQuery, die in der vendor.ymlKonfigurationsdatei definiert sind . Sie können auch Lieferanten- oder Lieferantendateien in Ihrem Repository mithilfe von Linguist-Überschreibungen erstellen .

Ebenso werden Dokumentationsdateien in definiert documentation.ymlund können mithilfe von Linguist-Überschreibungen geändert werden .

Wie werden generierte Dateien erkannt?

Linguist verwendet einfache Regeln , um generierte Dateien zu erkennen, wobei sowohl die Pfade als auch der Inhalt der Dateien verwendet werden. Generierte Dateien werden in der Sprachstatistik nicht gezählt und nicht in diffs auf github.com angezeigt.

Was ist mit Programmier- und Auszeichnungssprachen?

In Linguist erhält jede Sprache einen Typ. Diese Typen finden Sie in der Hauptkonfigurationsdatei languages.yml. In der Statistik werden nur die Programmier- und Auszeichnungssprachen gezählt.

pchaigno
quelle
0

Nach einigem Basteln mit dem Linguisten habe ich das bemerkt.

Bei Dateien mit einem Shebang wird der Shebang bei der Bestimmung der Sprache berücksichtigt, scheint jedoch gegenüber anderen Token gleichmäßig gewichtet zu sein . Dies scheint ein großer Fehler zu sein, da der Shebang die Sprache der Datei definitiv definieren sollte.

Dies kann Probleme beim Hervorheben verursachen.

Steven Penny
quelle
Diese Antwort hat mehrere defekte Links. Dies gilt auch für diese Antwort, wie sie beim Stapelaustausch angezeigt wird : webapps.stackexchange.com/a/40110 . Schade, denn ich würde mir diese Links gerne ansehen!
Shmim
-1

Dateierweiterungen sind das erste, was mir in den Sinn kommt.

Maarten Terpstra
quelle
Natürlich, aber ... mein Projekt enthielt unter anderem sowohl Dateien .jsals auch .ccDateien.
Justin Ethier