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博客文章所描述的那样(这个问题最初被问到几个月后才出现)。
首先,知道你可以使用语言覆盖替代你的仓库中的文件检测到的语言 。
现在,简而言之,
- 每个存储库都使用语言统计的第一语言进行标记。
- 语言统计数据计算每个检测到的编程或标记语言的文件总大小 。 供应商,文档和生成的文件不计算在内。
- 每个文件的语言由开源项目Linguist检测 。
语言学家如何检测语言?
语言学家依次依靠以下策略 ,并在find完美匹配时立即返回语言(返回单一语言的策略)。
- 寻找Emacs和Vim模式 。
- 已知的文件名。 一些文件名与特定语言相关联(认为
Makefile
)。 - 找一个shebang。 带有
#!/bin/bash
文件的文件将被分类为Shell。 - 已知的文件扩展名。 语言有一组与其关联的扩展。 然而,与这一战略有很多冲突。 相互矛盾的结果(思考C ++,C和Objective-C中的
.h
)被随后的策略细化。 - 一组启发式规则 。 他们通常依靠文件内容的正则expression式来尝试和识别语言(例如,
^[^#]+:-
对于Prolog )。 - 训练样本文件的朴素贝叶斯分类器 。 最后的策略,准确性最低。 贝叶斯分类器总是将语言的子集作为input; 这并不意味着要在所有的语言中进行分类。 返回分类器find的最佳匹配。
什么是unvendored和文档文件?
语言学家认为一些文件是有价值的 ,这意味着它们不包括在语言统计中。 这些包括第三方库,如jQuery,并在vendor.yml
configuration文件中定义。 您也可以使用语言覆盖来在您的存储库中供应商或销售商文件。
同样,文档文件在documentation.yml
中定义,并且可以使用语言覆盖来更改。
如何检测生成的文件?
语言学家依靠简单的规则来检测生成的文件,同时使用文件的path和内容。 生成的文件不计入语言统计中,不会在github.com上以差异显示。
编程和标记语言呢?
在语言学家中,每种语言都是一种types。 这些types可以在主configuration文件languages.yml
。 只有编程和标记语言统计在内。
经过一些修改语言学家后,我已经注意到了这一点。
对于具有Shebang的文件, Shebang在确定语言时被考虑,但是似乎被其他标记统一加权。 这似乎是一个很大的错误,因为Shebang应该明确定义文件的语言。
这可能会导致突出显示的问题 。
文件扩展名是我首先想到的。