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

84

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

Джастин Этье
источник
14
Считайте, что вам повезло. Я пишу проект Ruby on Rails, но поскольку я использую Twitter Bootstrap, Github считает, что мой проект - это Javascript, а не предполагаемый Ruby
2
@davblayn Я думаю, что github.com/github/linguist/blob/master/lib/linguist/vendor.yml решит вашу проблему. Также можно использовать CDN для начальной загрузки.
Эрик Уилсон
3
Этот вопрос кажется не по теме, потому что он не о программировании. См. Какие темы можно задать здесь в Справочном центре. Возможно, лучше спросить Web Apps Stack Exchange .
jww
Также см. Тег Misidentified Language на трекере Github для Linguist .
jww
1
Вы можете сказать механизму статистики неправду о типах файлов, чтобы подделать результат. См. Stackoverflow.com/a/27099628/492
CAD bloke

Ответы:

81

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

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


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

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

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

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

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

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


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

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

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

VonC
источник
2
Спасибо за информацию. Я думаю, что до сих пор нет возможности изменить язык вручную.
noob
Это уже не так! Приведенные ниже ответы относительно лингвиста более точны. Проверьте Мой репозиторий отмечен как неправильный язык и Почему мой любимый язык не распознается на help.github.com . Отказ от ответственности: я работаю в группе поддержки GitHub.
nuclearsandwich
@nuclearsandwich Отлично, я обновил ответ, завершив ваше редактирование. Примечание: я буду в штаб-квартире GitHub в пятницу, 10 мая, встречусь с Джоном Гритом и другими помощниками :)
VonC
Я просто хочу добавить, что не отмечать репозиторий или позволять пользователю выбирать основной язык было бы намного удобнее, чем автоматически угадывать, потому что мой репозиторий github.com/salda/file_scraper в основном на C ++ с немного C, но помечен как 70 % Цель-C.
Лукас Салич
13

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

Марк Рушаков
источник
Отлично, на момент ответа я этого не видел. +1
VonC
4

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

Итак, в двух словах,

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

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

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. .

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

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

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

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

Pchaigno
источник
0

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

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

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

Стивен Пенни
источник
В этом ответе есть несколько неработающих ссылок. Это также верно в отношении этого ответа, поскольку он появляется при обмене стеками: webapps.stackexchange.com/a/40110 . Жаль, как я хотел бы посмотреть на эти ссылки!
shmim 06
-1

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

Маартен Терпстра
источник
Конечно, но ... мой проект содержал .jsи .ccфайлы, и другие расширения.
Джастин Этье