github如何弄清楚项目的语言?


84

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


14
您可以认为自己很幸运。我正在编写Ruby on Rails项目,但由于我使用的是Twitter Bootstrap,因此Github认为我的项目是Javascript,而不是预期的Ruby

2
@davblayn我认为github.com/github/linguist/blob/master/lib/linguist/vendor.yml可以解决您的问题。也可以使用CDN进行引导。
埃里克·威尔逊

3
这个问题似乎与主题无关,因为它与编程无关。请在帮助中心中查看我可以询问哪些主题。也许Web Apps Stack Exchange是一个更好的选择。
2014年

另请参阅Github跟踪器上针对语言学家使用的误认语言标签。
2014年

1
您可以告诉统计引擎有关文件类型的谎言,以弄乱结果。请参阅stackoverflow.com/a/27099628/492
CAD bloke,

Answers:


81

nuclearsandwich(GitHub支持团队或“ supportocat”)于2013年4月更新:

如果您所需的语言没有收到语法突出显示,您可以向语言学家图书馆添加它。


(原始答案,2012年10月)

GitHub支持上的线程对此进行了解释:

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

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

由于这不是100%准确的,因此需要增加一些内容:

对于猜测错误的情况,我也将投票支持一个简单的手动替代开关。


注意:正如马克·拉沙科夫Mark Rushakoff)在回答中提到的那样(建议),此后语言学家项目(自2011年6月开源)的猜测变得更好。
您仍然可以看到问题:GitHub Linguist Issues
看到这里更多细节

一旦检测到该语言,它将被传递到Albino(一个Pygments包装器),它会进行实际的语法突出显示。

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


2
谢谢(你的)信息。我想仍然没有办法手动修改语言。
noob 2012年

这已不再是这种情况!下面关于语言学家的答案更接近于此。出“我的存储库”被标记为错误的语言,以及为什么help.github.com无法识别我最喜欢的语言。免责声明:我在GitHub的支持团队工作。
nuclearsandwich

@nuclearsandwich很好,我已经更新了答案,完成了您的编辑。注意:我将于5月10日星期五在GitHub总部与John Greet和其他支持者会面:)
VonC

我只想补充一点,不标记存储库或让用户选择主要语言比自动猜测要方便得多,因为我的存储库github.com/salda/file_scraper主要是C ++,带有一点点C,但标记为70 %Objective-C。
卢卡斯·萨利奇


4

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

简而言之,

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

语言学家如何检测语言?

语言学家依序采用以下策略,并在找到完全匹配的语言(返回一种语言的策略)后立即返回该语言。

  1. 查找Emacs和Vim模式行
  2. 已知文件名。一些文件名与特定的语言相关联(请考虑Makefile)。
  3. 寻找一个射手。带有#!/bin/bashShebang的文件将归类为Shell。
  4. 已知文件扩展名。语言具有一组与之关联的扩展名。但是,这种策略存在很多冲突。冲突的结果(认为C ++,C和Objective-C用于.h)可以通过后续策略来完善。
  5. 一套启发式规则。他们通常依赖于文件内容的正则表达式来尝试识别语言(例如^[^#]+:-Prolog)。
  6. 朴素贝叶斯分类器在样本文件上训练。最后的策略,最低的准确性。贝叶斯分类器始终将语言的子集作为输入。它并不意味着要在所有语言之间进行分类。返回分类器找到的最佳匹配。

什么是未提供的文档文件?

语言学家将某些文件视为已出售,这意味着它们不包含在语言统计中。这些包括第三方库(例如jQuery),并且在vendor.yml配置文件中定义。您还可以使用Linguist覆盖覆盖供应商中的供应商文件或不供应商文件。

同样,文档文件在语言定义中定义,documentation.yml并且可以使用Linguist替代进行更改。

如何检测生成的文件?

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

编程和标记语言呢?

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


0

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

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

这可能导致突出显示问题


这个答案有几个断开的链接。对于出现在堆栈交换中的这个答案也是如此:webapps.stackexchange.com/a/40110。很遗憾,我想看看这些链接!
shmim 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.