Como o github descobre a linguagem de um projeto?


84

Recentemente, eu estava trabalhando em um projeto github em JavaScript e C ++ e percebi que o github marcou o projeto como C ++. Se você tiver que escolher uma única linguagem, esta provavelmente é a designação correta, já que o código C ++ é compilado como uma biblioteca JavaScript, mas isso me fez pensar ... como o github descobre em qual linguagem marcar cada projeto?


14
Você pode se considerar com sorte. Estou escrevendo um projeto Ruby on Rails, mas como estou usando o Twitter Bootstrap, o Github pensa que meu projeto é Javascript, em vez do Ruby pretendido

2
@davblayn Acho que github.com/github/linguist/blob/master/lib/linguist/vendor.yml resolveria seu problema. Também usar um CDN para bootstrap funcionaria.
Eric Wilson

3
Esta questão parece estar fora do tópico porque não se trata de programação. Veja sobre quais tópicos posso perguntar aqui na Central de Ajuda. Talvez o Web Apps Stack Exchange seja um lugar melhor para perguntar.
jww

Consulte também a tag Misidentified Language no Github tracker for Linguist .
jww

1
Você pode dizer que o mecanismo de estatísticas mente sobre os tipos de arquivo para falsificar o resultado. Consulte stackoverflow.com/a/27099628/492
CAD bloke

Respostas:


81

Atualização de abril de 2013, por nuclearsandwich (equipe de suporte do GitHub ou "supportocat"):

Se o seu idioma desejado não estiver recebendo destaque de sintaxe, você pode contribuir com a biblioteca do Linguist para adicioná-lo.


(Resposta original, outubro de 2012)

Este tópico no suporte do GitHub explica isso:

Ele apenas resume o tamanho dos arquivos para cada extensão. O maior "ganha".

Gostaríamos de evitar abrir arquivos e analisar seu conteúdo, pois ambos retardariam o processo ... mas esse pode ser o único método de resolver conflitos como este.

Como isso não é 100% preciso, isso levou alguns a adicionar:

Eu também votaria em uma chave de controle manual simples para os casos em que a suposição está errada.


Nota: como Mark Rushakoff menciona em sua resposta (votação positiva), a suposição melhorou desde então com o projeto linguístico (código aberto em junho de 2011).
Você pode ver que ainda há problemas: Problemas de linguista do GitHub .
Veja aqui para mais detalhes :

Depois que o idioma é detectado, ele é passado para Albino , um wrapper de Pygments , que realça a sintaxe real.

E você pode adicionar diretivas linguísticas em um arquivo .gitattributes .


2
Obrigado pela informação. Acho que ainda não há como modificar o idioma manualmente.
noob

Isso não é mais o caso! As respostas abaixo sobre linguista estão mais perto do alvo. Confira Meu repositório está marcado como o idioma errado e Por que meu idioma favorito não é reconhecido em help.github.com . Aviso de isenção de responsabilidade: eu trabalho na equipe de suporte do GitHub.
nuclearsandwich de

@nuclearsandwich Excelente, atualizei a resposta, concluindo sua edição. Observação: estarei na sede do GitHub sexta-feira, 10 de maio, encontrando-me com John Greet e outros supportocats :)
VonC de

Só quero acrescentar que não marcar repositório ou deixar que o usuário escolha o idioma principal seria muito mais conveniente do que adivinhar automaticamente, porque meu repositório github.com/salda/file_scraper é principalmente em C ++ com um pouco de C, mas marcado como 70 % Objective-C.
Lukas Salich de


4

Primeiro, saiba que você pode substituir o idioma detectado para arquivos em seu repositório usando substituições do Linguist .

Agora, em poucas palavras,

  1. Cada repositório é marcado com o primeiro idioma das estatísticas de idioma .
  2. As estatísticas da linguagem contam o tamanho total dos arquivos para cada linguagem de programação ou marcação detectada. Arquivos de fornecedores, documentação e gerados não são contados.
  3. O idioma de cada arquivo é detectado pelo Linguist do projeto de código aberto .

Como o Linguist detecta os idiomas?

Linguist conta com as seguintes estratégias , em ordem, e retorna o idioma assim que encontra uma correspondência perfeita (estratégia com um único idioma retornado).

  1. Procure modelines Emacs e Vim .
  2. Nome de arquivo conhecido. Alguns nomes de arquivo são associados a idiomas específicos (pense Makefile).
  3. Procure um shebang. Um arquivo com um #!/bin/bashshebang será classificado como Shell.
  4. Extensão de arquivo conhecida. Os idiomas possuem um conjunto de extensões associadas a eles. Existem, no entanto, muitos conflitos com essa estratégia. Os resultados conflitantes (pense em C ++, C e Objective-C para .h) são refinados pelas estratégias subsequentes.
  5. Um conjunto de regras heurísticas . Eles geralmente contam com expressões regulares sobre o conteúdo dos arquivos para tentar identificar o idioma (por exemplo, ^[^#]+:-para Prolog ).
  6. Um classificador bayesiano ingênuo treinado em arquivos de amostra . Última estratégia, menor precisão. O classificador bayesiano sempre leva um subconjunto de linguagens como entrada; não se destina a classificar entre todas as línguas. A melhor correspondência encontrada pelo classificador é retornada.

O que são arquivos não vendidos e arquivos de documentação?

O Linguist considera alguns arquivos como vendidos , o que significa que não são incluídos nas estatísticas do idioma. Isso inclui bibliotecas de terceiros, como jQuery, e são definidas no vendor.ymlarquivo de configuração. Você também pode fornecer ou cancelar o fornecimento de arquivos em seu repositório usando substituições do Linguist .

Da mesma forma, os arquivos de documentação são definidos documentation.ymle podem ser alterados usando as substituições do Linguist .

Como os arquivos gerados são detectados?

O Linguist depende de regras simples para detectar os arquivos gerados, usando os caminhos e o conteúdo dos arquivos. Os arquivos gerados não são contados nas estatísticas do idioma e não são exibidos nos diffs em github.com.

E quanto às linguagens de programação e marcação?

Em Linguist, cada idioma recebe um tipo. Esses tipos podem ser encontrados no arquivo de configuração principal languages.yml,. Apenas as linguagens de programação e marcação são contadas nas estatísticas.


0

Depois de alguns ajustes com o linguista , percebi isso.

Para arquivos com um Shebang , o Shebang é considerado ao determinar o idioma, mas parece ter o mesmo peso em relação a outros tokens . Este parece ser um grande erro porque o Shebang deve definir definitivamente o idioma do arquivo.

Isso pode causar problemas com o realce.


Esta resposta tem vários links quebrados. Isso também é verdadeiro para a resposta que aparece na troca de pilha: webapps.stackexchange.com/a/40110 . Uma pena, pois gostaria de ver esses links!
shmim

-1

Extensões de arquivo é a primeira coisa que me vem à mente.


Claro, mas ... meu projeto continha os dois arquivos .jse .cc, entre outras extensões.
Justin Ethier
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.