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

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

5 ответов

Решение

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

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


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

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

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

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

Поскольку это не на 100% точно, это привело к тому, что некоторые добавили:

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


Примечание: как Mark Rushakoff в своем ответе (с голосованием), с тех пор гадание стало лучше благодаря проекту лингвиста (с открытым исходным кодом с июня 2011 года).
Вы можете видеть, что все еще есть проблемы: GitHub Linguist Issues.
Смотрите здесь для более подробной информации:

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

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

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

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

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

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

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

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

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

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

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

Точно так же файлы документации определены в documentation.yml и может быть изменено с помощью переопределений Linguist.

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

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

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

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

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

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

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

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

Другие вопросы по тегам