91

我最近在使用 JavaScript 和 C++ 编写一个 github 项目,并注意到 github 将该项目标记为 C++。如果您必须选择一种语言,这可能是正确的名称,因为 C++ 代码被编译为 JavaScript 库,但这让我想知道...... github 如何确定每个项目的标记语言?

4

5 回答 5

88

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

如果您想要的语言没有收到语法突出显示,您可以向语言学家库添加它。


(原始答案,2012 年 10 月)

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

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

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

由于这不是 100% 准确,这导致一些人补充说:

对于猜测错误的情况,我也会投票支持简单的手动覆盖开关。


注意:正如Mark Rushakoff他的回答(赞成)中提到的那样,从那时起,语言学家项目(从 2011 年 6 月开始开源)的猜测变得更好。
您可以看到仍然存在问题:GitHub Linguist Issues
请参阅此处了解更多详细信息

一旦检测到语言,它就会被传递给Albino,这是一个Pygments包装器,它执行实际的语法高亮显示。

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

于 2011-03-15T22:07:50.693 回答
14

目前,Github 的linguist 项目用于确定语言统计数据,如这篇 Github 博客文章中所述(最初是在提出这个问题几个月后发布的)。

于 2012-04-06T18:23:56.913 回答
5

首先,要知道您可以使用Linguist overrides 覆盖为存储库中的文件检测到的语言。

现在,简而言之,

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

语言学家如何检测语言?

Linguist 依次依赖以下策略,并在找到完美匹配后立即返回该语言(返回单一语言的策略)。

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

什么是非供应商文件和文档文件?

Linguist 将某些文件视为vendored,这意味着它们不包含在语言统计信息中。这些包括第三方库,例如 jQuery,并在vendor.yml配置文件中定义。您还可以使用Linguist overrides在您的存储库中供应或取消供应文件。

类似地,文档文件在中定义documentation.yml并且可以使用Linguist overrides进行更改。

如何检测生成的文件?

Linguist 依靠简单的规则来检测生成的文件,同时使用文件的路径和内容。生成的文件不计入语言统计数据,也不显示在 github.com 上的差异中。

那么编程和标记语言呢?

在语言学家中,每种语言都有一个类型。这些类型可以在主配置文件中找到,languages.yml. 只有编程和标记语言被计入统计数据。

于 2017-08-20T10:59:59.827 回答
1

在与语言学家进行一些修补之后,我注意到了这一点。

对于带有Shebang的文件,在确定语言时会考虑 Shebang,但似乎与其他 标记的权重相当。这似乎是一个很大的错误,因为 Shebang 应该明确定义文件的语言。

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

于 2012-12-21T02:45:44.707 回答
-1

文件扩展名是我想到的第一件事。

于 2011-03-15T22:01:38.073 回答