Как github определяет язык проекта? - PullRequest
79 голосов
/ 16 марта 2011

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

Ответы [ 5 ]

78 голосов
/ 16 марта 2011

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

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


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

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

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

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

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

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


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

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

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

13 голосов
/ 06 апреля 2012

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

3 голосов
/ 20 августа 2017

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

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

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

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

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

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

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

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

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

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

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

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

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

0 голосов
/ 21 декабря 2012

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

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

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

0 голосов
/ 16 марта 2011

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

...