¿Cómo averigua github el lenguaje de un proyecto?

84

Recientemente estuve trabajando en un proyecto de github tanto en JavaScript como en C ++, y noté que github etiquetó el proyecto como C ++. Si tiene que elegir un solo idioma, esta es probablemente la designación correcta ya que el código C ++ está compilado como una biblioteca de JavaScript, pero esto me hizo preguntarme ... ¿cómo averigua github en qué idioma etiquetar cada proyecto?

Justin Ethier
fuente
14
Puedes considerarte afortunado. Estoy escribiendo un proyecto de Ruby on Rails, pero como estoy usando Twitter Bootstrap, Github cree que mi proyecto es Javascript, en lugar del Ruby previsto
2
@davblayn Creo que github.com/github/linguist/blob/master/lib/linguist/vendor.yml resolvería tu problema. También funcionaría usar una CDN para bootstrap.
Eric Wilson
3
Esta pregunta parece estar fuera de tema porque no se trata de programación. Consulte ¿Qué temas puedo preguntar aquí en el Centro de ayuda? Quizás Web Apps Stack Exchange sería un mejor lugar para preguntar.
jww
Consulte también la etiqueta de idioma incorrectamente identificado en el rastreador de Github para lingüista .
jww
1
Puede decirle al motor de estadísticas mentiras sobre los tipos de archivos para manipular el resultado. Ver stackoverflow.com/a/27099628/492
CAD bloke

Respuestas:

81

Actualización de abril de 2013, por nuclearsandwich (equipo de soporte de GitHub o "supportocat"):

Si el idioma que desea no recibe el resaltado de sintaxis, puede contribuir a la biblioteca Linguist para agregarlo.


(Respuesta original, octubre de 2012)

Este hilo sobre el soporte de GitHub lo explica:

Simplemente resume los tamaños de archivo para cada extensión. El más grande "gana".

Nos gustaría evitar abrir archivos y analizar su contenido, ya que ambos ralentizarían el proceso ... pero ese podría ser el único método para resolver conflictos como este.

Dado que esto no es 100% exacto, eso llevó a algunos a agregar:

Yo también votaría por un simple interruptor de anulación manual para los casos en que la suposición sea incorrecta.


Nota: como menciona Mark Rushakoff en su respuesta (votada a favor), las conjeturas mejoraron desde entonces con el proyecto lingüista (de código abierto desde junio de 2011).
Sin embargo, puede ver que todavía hay problemas: Problemas de lingüistas de GitHub .
Vea aquí para más detalles :

Una vez que se ha detectado el idioma, se pasa a Albino , un contenedor de Pygments , que realiza el resaltado de sintaxis real.

Y puede agregar directivas lingüísticas en un archivo .gitattributes .

VonC
fuente
2
Gracias por la info. Supongo que todavía no hay forma de modificar el idioma manualmente.
novato
¡Este ya no es el caso! Las respuestas a continuación sobre lingüista están más cerca de la marca. Consulte Mi repositorio está marcado como el idioma incorrecto y ¿Por qué no se reconoce mi idioma favorito en help.github.com ? Descargo de responsabilidad: trabajo en el equipo de soporte de GitHub.
Nuclearsandwich
@nuclearsandwich Excelente, he actualizado la respuesta, completando su edición. Nota: Estaré en la sede de GitHub el viernes 10 de mayo para reunirme con John Greet y otros seguidores :)
VonC
Solo quiero agregar que no marcar el repositorio o dejar que el usuario elija el idioma principal sería mucho más conveniente que adivinar automáticamente, porque mi repositorio github.com/salda/file_scraper está principalmente en C ++ con un poco de C, pero marcado como 70 % C objetivo.
Lukas Salich
13

Actualmente, el proyecto lingüístico de Github es lo que se utiliza para determinar las estadísticas del idioma, como se describe en esta publicación del blog de Github (que salió unos meses después de que se planteó originalmente esta pregunta).

Mark Rushakoff
fuente
Excelente, no lo vi en el momento de mi respuesta. +1
VonC
4

Primero, sepa que puede anular el idioma detectado para los archivos en su repositorio utilizando anulaciones de Linguist .

Ahora, en pocas palabras,

  1. Cada repositorio está etiquetado con el primer idioma de las estadísticas de idiomas .
  2. Las estadísticas de idiomas cuentan el tamaño total de los archivos para cada lenguaje de programación o marcado detectado. Los archivos vendidos, de documentación y generados no se cuentan.
  3. El idioma de cada archivo es detectado por el proyecto de código abierto Linguist .

¿Cómo detecta Linguist los idiomas?

Linguist se basa en las siguientes estrategias , en orden, y devuelve el idioma tan pronto como encuentra una combinación perfecta (estrategia con un solo idioma devuelto).

  1. Busque modelos de Emacs y Vim .
  2. Nombre de archivo conocido. Algunos nombres de archivo están asociados a idiomas específicos (piense Makefile).
  3. Busque un shebang. Un archivo con un #!/bin/bashshebang se clasificará como Shell.
  4. Extensión de archivo conocida. Los idiomas tienen un conjunto de extensiones asociadas. Sin embargo, existen muchos conflictos con esta estrategia. Los resultados contradictorios (piense en C ++, C y Objective-C para .h) son refinados por las estrategias posteriores.
  5. Un conjunto de reglas heurísticas . Por lo general, se basan en expresiones regulares sobre el contenido de los archivos para intentar identificar el idioma (por ejemplo, ^[^#]+:-para Prolog ).
  6. Un clasificador bayesiano ingenuo entrenado en archivos de muestra . Última estrategia, menor precisión. El clasificador bayesiano siempre toma un subconjunto de idiomas como entrada; no está destinado a clasificar entre todos los idiomas. Se devuelve la mejor coincidencia encontrada por el clasificador.

¿Qué son los archivos no revelados y de documentación?

Linguist considera algunos archivos como vendidos , lo que significa que no se incluyen en las estadísticas del idioma. Estos incluyen bibliotecas de terceros como jQuery y se definen en el vendor.ymlarchivo de configuración. También puede vender o desvelar archivos en su repositorio usando anulaciones de Linguist .

De manera similar, los archivos de documentación se definen en documentation.ymly se pueden cambiar usando anulaciones de Linguist .

¿Cómo se detectan los archivos generados?

Linguist se basa en reglas simples para detectar archivos generados, utilizando tanto las rutas como el contenido de los archivos. Los archivos generados no se cuentan en las estadísticas de idioma y no se muestran en diffs en github.com.

¿Qué pasa con los lenguajes de programación y de marcado?

En lingüista, a cada idioma se le asigna un tipo. Estos tipos se pueden encontrar en el archivo de configuración, languages.yml. Solo los lenguajes de programación y de marcado se cuentan en las estadísticas.

pchaigno
fuente
0

Después de algunos retoques con el lingüista, me he dado cuenta de esto.

Para archivos con un Shebang , el Shebang se considera al determinar el idioma, pero parece estar ponderado de manera uniforme frente a otros tokens . Esto parece ser un gran error porque Shebang debería definir definitivamente el idioma del archivo.

Esto puede causar problemas con el resaltado.

Steven Penny
fuente
Esta respuesta tiene varios enlaces rotos. Esto también es cierto para esta respuesta, ya que aparece en el intercambio de pila: webapps.stackexchange.com/a/40110 . ¡Una lástima, ya que me gustaría ver esos enlaces!
shmim
-1

Las extensiones de archivo son lo primero que me viene a la mente.

Maarten Terpstra
fuente
Por supuesto, pero ... mi proyecto contenía archivos .jsy .cc, entre otras extensiones.
Justin Ethier