web-dev-qa-db-fra.com

Comment github détermine-t-il la langue d'un projet?

Je travaillais récemment sur un projet github en JavaScript et C++, et j'ai remarqué que github marquait le projet en C++. Si vous devez choisir une seule langue, c'est probablement la désignation correcte puisque le code C++ est compilé en tant que bibliothèque JavaScript, mais cela m'a fait me demander ... comment github détermine-t-il quelle langue étiqueter chaque projet?

79
Justin Ethier

Mise à jour d'avril 2013, par nuclearsandwich (équipe de support GitHub ou "supportocat"):

Si la langue de votre choix ne reçoit pas de coloration syntaxique, vous pouvez contribuer à la bibliothèque Linguist pour l'ajouter.


(Réponse originale, oct. 2012)

Ceci thread sur le support GitHub l'explique:

Il résume simplement la taille des fichiers pour chaque extension. Le plus gros "gagne".

Nous aimerions éviter d'ouvrir des fichiers et d'analyser leur contenu, car les deux ralentiraient le processus ... mais cela pourrait être la seule méthode pour résoudre des conflits comme celui-ci.

Comme ce n'est pas exact à 100%, cela a amené certains à ajouter:

Moi aussi, je voterais pour un simple interrupteur de priorité manuelle pour les cas où la supposition est fausse.


Remarque: comme Mark Rushakoff mentionne dans sa réponse (vote positif), les suppositions se sont améliorées depuis lors avec le projet linguiste (open-source à partir de juin 2011).
Vous pouvez voir qu'il y a encore des problèmes: GitHub Linguist Issues .
Voir ici pour plus de détails :

Une fois la langue détectée, elle est transmise à Albino , un wrapper Pygments , qui fait la mise en évidence de la syntaxe.

Et vous pouvez ajouter des directives linguistes dans un fichier .gitattributes .

78
VonC

Actuellement, Github projet linguiste est ce qui est utilisé pour déterminer les statistiques linguistiques, comme décrit dans ce blog Github (qui est sorti quelques mois après que cette question ait été posée à l'origine).

13
Mark Rushakoff

Tout d'abord, sachez que vous pouvez remplacer la langue détectée pour les fichiers de votre référentiel à l'aide de Linguist remplace .

Maintenant, en un mot,

  1. Chaque référentiel est étiqueté avec la première langue des statistiques de langue .
  2. Les statistiques de langue comptent la taille totale des fichiers pour chaque langage de programmation ou de balisage détecté. Les fichiers vendus, documentés et générés ne sont pas comptés.
  3. La langue de chaque fichier est détectée par le projet open source Linguist.

Comment Linguist détecte-t-il les langues?

Le linguiste s'appuie sur le stratégies suivantes , dans l'ordre, et renvoie la langue dès qu'il a trouvé une correspondance parfaite (stratégie avec une seule langue retournée).

  1. Recherchez modèles Emacs et Vim .
  2. Nom de fichier connu. Certains noms de fichiers sont associés à des langues spécifiques (pensez Makefile ).
  3. Cherchez un Shebang. Un fichier avec #!/bin/bash Shebang sera classé comme Shell.
  4. Extension de fichier connue. Les langues ont un ensemble d'extensions qui leur sont associées. Il y a cependant beaucoup de conflits avec cette stratégie. Les résultats contradictoires (pensez C++, C et Objective-C pour .h) sont affinés par les stratégies suivantes.
  5. Un ensemble de règles heuristiques . Ils s'appuient généralement sur des expressions régulières sur le contenu des fichiers pour essayer d'identifier la langue (par exemple, ^[^#]+:- pour Prolog ).
  6. Un classificateur bayésien naïf formé sur fichiers d'exemple . Dernière stratégie, précision la plus faible. Le classificateur bayésien prend toujours un sous-ensemble de langues en entrée; il n'est pas destiné à être classé parmi toutes les langues. La meilleure correspondance trouvée par le classificateur est renvoyée.

Que sont les fichiers non distribués et les fichiers de documentation?

Linguist considère certains fichiers comme vendus, ce qui signifie qu'ils ne sont pas inclus dans les statistiques linguistiques. Ceux-ci incluent des bibliothèques tierces telles que jQuery et sont définis dans vendor.yml fichier de configuration. Vous pouvez également éditer ou supprimer des fichiers dans votre référentiel à l'aide de Linguist remplace .

De même, les fichiers de documentation sont définis dans documentation.yml et peut être modifié à l'aide de Linguist remplace .

Comment les fichiers générés sont-ils détectés?

Linguist s'appuie sur règles simples pour détecter les fichiers générés, en utilisant à la fois les chemins et le contenu des fichiers. Les fichiers générés ne sont pas comptés dans les statistiques linguistiques et ne sont pas affichés dans les différences sur github.com.

Qu'en est-il des langages de programmation et de balisage?

Dans Linguist, chaque langue reçoit un type. Ces types se trouvent dans le fichier de configuration principal, languages.yml . Seuls les langages de programmation et de balisage sont comptabilisés dans les statistiques.

3
pchaigno

Après quelques bricolages avec linguiste je l'ai remarqué.

Pour les fichiers avec un ( Shebang , le Shebang est pris en compte lors de la détermination de la langue, mais semble être également pondéré par rapport aux autres jetons . Cela semble être une grosse erreur car le Shebang devrait définir définitivement la langue du fichier.

Cela peut entraîner problèmes avec la mise en surbrillance.

0
Steven Penny