当您向 GitHub 仓库推送代码变更时,语言统计条(Language stats bar)不会立即反映最新变化,这是因为系统会安排一个低优先级的后台任务来分析默认分支。这个分析过程会根据 Linguist 的工作机制进行,并且其结果会被缓存,只有当仓库本身被更新时,缓存才会更新。由于分析是通过低优先级的后台作业执行的,特别是在系统繁忙的时段,语言统计条可能需要一段时间才能显示最新的变化。

**Linguist 的工作流程概述:**

Linguist 从 `languages.yml` 中获取已知的语言列表,然后使用一系列方法来尝试确定每个文件的语言,并得出整个仓库的语言分布。

1. **文件筛选:** Linguist 首先遍历仓库中的所有文件,排除掉被判定为二进制数据、预置代码、生成代码、文档,或者被定义为数据(如 SQL)或散文(如 Markdown)语言的文件,同时也会考虑任何语言覆盖设置。
2. **语言确定策略(按顺序):** 对于剩余的文件,其语言会按照以下策略的顺序依次确定,每一步都会尝试精确识别语言或缩小可能的语言范围:
* Vim 或 Emacs modeline
* 常用文件名
* Shell shebang
* 文件扩展名
* XML 头部
* Man 页面部分
* 启发式方法(heuristics)
* 朴素贝叶斯分类(naïve Bayesian classification)

最终,这些分析结果用于生成语言统计条,该条显示了仓库中各语言的百分比,这些百分比是基于 List Languages API 报告的代码字节数计算得出的。

**缓存与更新机制:**

在 GitHub.com 上,当您推送变更时,系统会排队一个低优先级的后台作业来分析默认分支。分析的结果会被缓存,并且只有当整个仓库被更新时,这个缓存才会进行更新。因此,由于依赖于低优先级的后台作业,语言统计条的更新需要时间,尤其是在系统负载较高的时期。

信息来源