github如何找出一个项目的语言?

我最近正在使用JavaScript和C ++进行github项目,并注意到github将项目标记为C ++。 如果你必须select一种语言,这可能是正确的名称,因为C ++代码被编译为一个JavaScript库,但这使我想知道…如何github找出什么语言来标记每个项目?

2013年4月更新,由nuclearsandwich (GitHub支持团队或“supportocat”)提供:

  • 帮助页面“ 我的存储库被标记为错误的语言 ”提到现在使用语言库来确定语法高亮和回购统计的文件语言。 语言学家将从统计中排除某些文件名和path, 排除某些供应商文件和目录 。

  • 帮助页面“ 为什么不是我最喜欢的语言被认可? ”补充说:

如果您所需的语言没有收到语法突出显示,您可以贡献给语言学家库添加它。


(原文,2012年10月)

GitHub支持上的这个线程解释了它:

它只是总结每个扩展名的文件大小。 最大的一个“胜利”。

我们希望避免打开文件并parsing它们的内容,因为两者都会减慢进程速度……但是这可能是解决像这样的冲突的唯一方法。

由于这不是100%准确的,所以导致一些增加:

我也会投票给一个简单的手动覆盖开关的情况下,猜测是错误的。


注意:正如Mark Rushakoff在他的回答中提到的那样,从那时起语言学家项目 (2011年6月开放),猜测得到了更好的结果。
你可以看到仍然有问题: GitHub语言问题 。
在这里看到更多的细节 :

一旦语言被检测到,它就被传递给白皮书 ,一个Pygments包装器,它实际上语法高亮。

您可以在.gitattributes文件中添加语言指令

目前,Github的语言学项目就是用来确定语言统计数据的,就像这个Github博客文章所描述的那样(这个问题最初被问到几个月后才出现)。

首先,知道你可以使用语言覆盖替代你的仓库中的文件检测到的语言 。

现在,简而言之,

  1. 每个存储库都使用语言统计的第一语言进行标记。
  2. 语言统计数据计算每个检测到的编程或标记语言的文件总大小供应商,文档和生成的文件不计算在内。
  3. 每个文件的语言由开源项目Linguist检测

语言学家如何检测语言?

语言学家依次依靠以下策略 ,并在find完美匹配时立即返回语言(返回单一语言的策略)。

  1. 寻找Emacs和Vim模式 。
  2. 已知的文件名。 一些文件名与特定语言相关联(认为Makefile )。
  3. 找一个shebang。 带有#!/bin/bash文件的文件将被分类为Shell。
  4. 已知的文件扩展名。 语言有一组与其关联的扩展。 然而,与这一战略有很多冲突。 相互矛盾的结果(思考C ++,C和Objective-C中的.h )被随后的策略细化。
  5. 一组启发式规则 。 他们通常依靠文件内容的正则expression式来尝试和识别语言(例如, ^[^#]+:-对于Prolog )。
  6. 训练样本文件的朴素贝叶斯分类器 。 最后的策略,准确性最低。 贝叶斯分类器总是将语言的子集作为input; 这并不意味着要在所有的语言中进行分类。 返回分类器find的最佳匹配。

什么是unvendored和文档文件?

语言学家认为一些文件是有价值的 ,这意味着它们不包括在语言统计中。 这些包括第三方库,如jQuery,并在vendor.ymlconfiguration文件中定义。 您也可以使用语言覆盖来在您的存储库中供应商或销售商文件。

同样,文档文件在documentation.yml中定义,并且可以使用语言覆盖来更改。

如何检测生成的文件?

语言学家依靠简单的规则来检测生成的文件,同时使用文件的path和内容。 生成的文件不计入语言统计中,不会在github.com上以差异显示。

编程和标记语言呢?

在语言学家中,每种语言都是一种types。 这些types可以在主configuration文件languages.yml 。 只有编程和标记语言统计在内。

经过一些修改语言学家后,我已经注意到了这一点。

对于具有Shebang的文件, Shebang在确定语言时被考虑,但是似乎被其他标记统一加权。 这似乎是一个很大的错误,因为Shebang应该明确定义文件的语言。

这可能会导致突出显示的问题

文件扩展名是我首先想到的。