我最近在使用 JavaScript 和 C++ 编写一个 github 项目,并注意到 github 将该项目标记为 C++。如果您必须选择一种语言,这可能是正确的名称,因为 C++ 代码被编译为 JavaScript 库,但这让我想知道...... github 如何确定每个项目的标记语言?
5 回答
2013 年 4 月更新,由nucleussandwich(GitHub 支持团队或“supportocat”):
帮助页面“我的存储库被标记为错误的语言”提到现在使用linguist 库来确定用于语法突出显示和 repo 统计的文件语言。Linguist 将从统计中排除某些文件名和路径,不包括某些供应商文件和目录。
帮助页面“为什么我最喜欢的语言没有被识别? ”补充道:
如果您想要的语言没有收到语法突出显示,您可以向语言学家库添加它。
(原始答案,2012 年 10 月)
GitHub 支持上的这个线程解释了它:
它只是总结了每个扩展的文件大小。最大的一个“获胜”。
我们希望避免打开文件并解析其内容,因为两者都会减慢进程……但这可能是解决此类冲突的唯一方法。
由于这不是 100% 准确,这导致一些人补充说:
对于猜测错误的情况,我也会投票支持简单的手动覆盖开关。
注意:正如Mark Rushakoff在他的回答(赞成)中提到的那样,从那时起,语言学家项目(从 2011 年 6 月开始开源)的猜测变得更好。
您可以看到仍然存在问题:GitHub Linguist Issues。
请参阅此处了解更多详细信息:
目前,Github 的linguist 项目用于确定语言统计数据,如这篇 Github 博客文章中所述(最初是在提出这个问题几个月后发布的)。
首先,要知道您可以使用Linguist overrides 覆盖为存储库中的文件检测到的语言。
现在,简而言之,
- 每个存储库都标有语言统计中的第一种语言。
- 语言统计数据计算每种检测到的编程或标记语言的文件总大小。供应商、文档和生成的文件不计算在内。
- 每个文件的语言由开源项目Linguist检测。
语言学家如何检测语言?
Linguist 依次依赖以下策略,并在找到完美匹配后立即返回该语言(返回单一语言的策略)。
- 寻找Emacs 和 Vim 模式行。
- 已知文件名。一些文件名与特定语言相关联(想想
Makefile
)。 - 寻找一个shebang。带有
#!/bin/bash
shebang的文件将被归类为 Shell。 - 已知的文件扩展名。语言有一组与之关联的扩展。然而,这种策略存在很多冲突。相互矛盾的结果(想想 C++、C 和 Objective-C for
.h
)由后续策略改进。 - 一组启发式规则。他们通常依赖于文件内容的正则表达式来尝试和识别语言(例如,
^[^#]+:-
对于 Prolog)。 - 在样本文件上训练的朴素贝叶斯分类器。最后的策略,最低的准确性。贝叶斯分类器总是将语言的一个子集作为输入;它并不意味着在所有语言中进行分类。返回分类器找到的最佳匹配。
什么是非供应商文件和文档文件?
Linguist 将某些文件视为vendored,这意味着它们不包含在语言统计信息中。这些包括第三方库,例如 jQuery,并在vendor.yml
配置文件中定义。您还可以使用Linguist overrides在您的存储库中供应或取消供应文件。
类似地,文档文件在中定义documentation.yml
并且可以使用Linguist overrides进行更改。
如何检测生成的文件?
Linguist 依靠简单的规则来检测生成的文件,同时使用文件的路径和内容。生成的文件不计入语言统计数据,也不显示在 github.com 上的差异中。
那么编程和标记语言呢?
在语言学家中,每种语言都有一个类型。这些类型可以在主配置文件中找到,languages.yml
. 只有编程和标记语言被计入统计数据。
文件扩展名是我想到的第一件事。