Недавно я работал над проектом github как на JavaScript, так и на С++, и заметил, что github отметил проект как С++. Если вам нужно выбрать один язык, это, вероятно, правильное обозначение, так как код С++ скомпилирован как библиотека JavaScript, но это заставило меня задуматься... как github выясняет, на каком языке следует помечать каждый проект?
Как 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
Расширения файлов - это первое, что приходит мне на ум.