Как github определяет язык проекта?
Недавно я работал над проектом github на JavaScript и C++ и заметил, что github пометил проект как C++. Если вам нужно выбрать один язык, это, вероятно, правильное обозначение, поскольку код C++ скомпилирован как библиотека JavaScript, но это заставило меня задуматься... как github выясняет, на каком языке помечать каждый проект?
5 ответов
Обновление от апреля 2013 года, от nuclearsandwich ( nuclearsandwich поддержки GitHub или "supportocat"):
На странице справки " Мой репозиторий помечен как неправильный язык " упоминается использование в настоящее время библиотеки лингвистов для определения языка файлов для подсветки синтаксиса и статистики репо. Linguist исключит некоторые имена файлов и пути из статистики, исключая файлы и каталоги определенных поставщиков.
страница справки " Почему мой любимый язык не распознается? " добавляет:
Если ваш нужный язык не получает подсветку синтаксиса, вы можете добавить его в библиотеку Linguist.
(Оригинальный ответ, октябрь 2012 г.)
Эта тема о поддержке GitHub объясняет это:
Он просто суммирует размеры файлов для каждого расширения. Крупнейший из них "выигрывает".
Мы хотели бы не открывать файлы и анализировать их содержимое, так как это замедлит процесс... но это может быть единственным методом разрешения конфликтов, подобным этому.
Поскольку это не на 100% точно, это привело к тому, что некоторые добавили:
Я бы тоже проголосовал за простой ручной переключатель для случаев, когда предположение неверно.
Примечание: как Mark Rushakoff в своем ответе (с голосованием), с тех пор гадание стало лучше благодаря проекту лингвиста (с открытым исходным кодом с июня 2011 года).
Вы можете видеть, что все еще есть проблемы: GitHub Linguist Issues.
Смотрите здесь для более подробной информации:
Как только язык обнаружен, он передается в Albino, обертку Pygments, которая выполняет фактическую подсветку синтаксиса.
И вы можете добавить лингвистические директивы в файл.gitattributes.
В настоящее время лингвистический проект Github используется для определения языковой статистики, как описано в этом блог-посте Github (который вышел через несколько месяцев после того, как этот вопрос был первоначально задан).
Во-первых, знайте, что вы можете переопределить язык, обнаруженный для файлов в вашем хранилище, используя переопределения Linguist.
Теперь, в двух словах,
- Каждый репозиторий помечен первым языком из языковой статистики.
- Статистика языка учитывает общий размер файлов для каждого обнаруженного языка программирования или разметки. Поставленные, документация и сгенерированные файлы не учитываются.
- Язык каждого файла определяется открытым проектом Linguist.
Как лингвист обнаруживает языки?
Лингвист использует по порядку следующие стратегии и возвращает язык, как только найдет идеальное соответствие (стратегия с одним возвращенным языком).
- Ищите модели Emacs и Vim.
- Известное имя файла. Некоторые имена файлов связаны с конкретными языками
Makefile
). - Ищите шебанг. Файл с
#!/bin/bash
Шебанг будет классифицироваться как Shell. - Известное расширение файла. Языки имеют набор расширений, связанных с ними. Однако существует много конфликтов с этой стратегией. Противоречивые результаты (например, C++, C и Objective-C для
.h
) уточняются последующими стратегиями. - Набор эвристических правил. Обычно они используют регулярные выражения над содержимым файлов, чтобы попытаться определить язык (например,
^[^#]+:-
для пролога). - Наивный байесовский классификатор, обученный на примерах файлов. Последняя стратегия, самая низкая точность. Байесовский классификатор всегда принимает подмножество языков; оно не предназначено для классификации среди всех языков. Лучшее совпадение, найденное классификатором, возвращается.
Что такое непроверенные и файлы документации?
Linguist считает некоторые файлы вендорными, то есть они не включены в языковую статистику. К ним относятся сторонние библиотеки, такие как jQuery, и они определены в vendor.yml
конфигурационный файл. Вы также можете продавать или распаковывать файлы в своем хранилище, используя переопределения Linguist.
Точно так же файлы документации определены в documentation.yml
и может быть изменено с помощью переопределений Linguist.
Как обнаруживаются сгенерированные файлы?
Linguist использует простые правила для обнаружения сгенерированных файлов, используя как пути, так и содержимое файлов. Сгенерированные файлы не учитываются в языковой статистике и не отображаются в diffs на github.com.
А как насчет языков программирования и разметки?
В Linguist каждому языку присваивается тип. Эти типы можно найти в основном файле конфигурации, languages.yml
, В статистике учитываются только языки программирования и разметки.
После некоторого возни с лингвистом я это заметил.
Для файлов с Shebang, Shebang учитывается при определении языка, но, похоже, равномерно взвешивается по отношению к другим токенам. Это кажется большой ошибкой, потому что Шебанг должен окончательно определить язык файла.
Это может вызвать проблемы с выделением.