Как github определяет язык проекта?

Недавно я работал над проектом github как на JavaScript, так и на С++, и заметил, что github отметил проект как С++. Если вам нужно выбрать один язык, это, вероятно, правильное обозначение, так как код С++ скомпилирован как библиотека JavaScript, но это заставило меня задуматься... как github выясняет, на каком языке следует помечать каждый проект?

Ответ 1

Обновите апрель 2013 года, nuclearsandwich (команда поддержки GitHub или "supportocat" ):

Если ваш желаемый язык не получает подсветку синтаксиса, вы можете внести вклад в библиотеку Linguist, чтобы добавить его.


(Оригинальный ответ, октябрь 2012 г.)

Этот поток в поддержке GitHub объясняет это:

Он просто суммирует размеры файлов для каждого расширения. Самый крупный "побеждает".

Мы хотели бы избежать открытия файлов и разбора их содержимого, так как оба замедлят процесс... но это может быть единственный способ разрешения конфликтов, подобных этому.

Так как это не на 100% точнее, это привело к добавлению:

Я тоже проголосую за простой ручной переключатель для случаев, когда предположение неверно.


Примечание: как Марк Рушаков упоминает в своем ответе (upvoted), догадки улучшились с тех пор с лингвистический проект (открытый с июня 2011 года).
Вы можете видеть, что все еще есть проблемы: Проблемы GitHub Linguist.
Подробнее см. :

Как только язык был обнаружен, он передается в Albino, Pygments wrapper, который выполняет фактическую подсветку синтаксиса.

И вы можете добавить директивы лингвиста в файл .gitattributes.

Ответ 2

В настоящее время Gigub лингвистический проект - это то, что используется для определения статистики языка, как описано в этом сообщении блога Github (который вышел через несколько месяцев после того, как этот вопрос был первоначально задан).

Ответ 3

Во-первых, знайте, что вы можете переопределить обнаруженный язык для файлов в вашем репозитории, используя Linguist переопределяет.

Теперь, в двух словах,

  • Каждый репозиторий помечен первым языком из статистики языка.
  • Статистика языков подсчитывает общий размер файлов для каждого обнаруженного языка программирования или разметки. Файлы Vendored, документация и сгенерированные файлы не учитываются.
  • Язык каждого файла определяется проектом с открытым исходным кодом Linguist.

Как лингвист обнаруживает языки?

Linguist полагается на следующие стратегии в порядке и возвращает язык, как только он найдет идеальное совпадение (стратегия с одним язык возвращен).

  • Найдите Модели Emacs и Vim.
  • Известное имя файла. Некоторые имена файлов связаны с определенными языками (подумайте Makefile).
  • Ищите сибанга. Файл с #!/bin/bash shebang будет классифицироваться как Shell.
  • Известное расширение файла. Языки имеют набор связанных с ними расширений. Однако существует много конфликтов с этой стратегией. Конфликтующие результаты (думаю, С++, C и Objective-C для .h) уточняются в последующих стратегиях.
  • Набор эвристических правил. Обычно они полагаются на регулярные выражения над содержимым файлов, чтобы попытаться определить язык (например, ^[^#]+:- для Prolog).
  • Наивный байесовский классификатор, обученный образцам файлов. Последняя стратегия, низкая точность. Байесовский классификатор всегда принимает подмножество языков в качестве входных данных; он не предназначен для классификации среди всех языков. Возвращается наилучшее соответствие, найденное классификатором.

Что такое файлы unvendored и файлы документации?

Linguist рассматривает некоторые файлы как вендоры, то есть они не включены в статистику языка. К ним относятся сторонние библиотеки, такие как jQuery, и определены в конфигурационном файле vendor.yml. Вы также можете продавать или разворачивать файлы в своем репозитории, используя Лингвист переопределяет.

Аналогично, файлы документации определены в documentation.yml и могут быть изменены с помощью Лингвист переопределяет.

Как обнаружены сгенерированные файлы?

Linguist полагается на простые правила для обнаружения сгенерированных файлов, используя как пути, так и содержимое файлов. Сгенерированные файлы не учитываются в статистике языка и не отображаются в diff на github.com.

Как насчет языков программирования и разметки?

В лингвисте каждому языку задан тип. Эти типы можно найти в главном файле конфигурации, languages.yml. В статистике учитываются только языки программирования и разметки.

Ответ 4

После некоторого возиться с лингвистом I заметили это.

Для файлов с Shebang, Шебанг считается при определении языка, но, кажется, равномерным взвешенный по сравнению с другими токены. Это кажется большой ошибкой, потому что Шебанг должен окончательно определить язык файла.

Это может вызвать проблемы с подсветка.

Ответ 5

Расширения файлов - это первое, что приходит мне на ум.