Skip to content

生成文件大小写冲突导致 macOS 克隆后工作树异常 #39

Description

@linhongyu510

问题描述

仓库当前跟踪了 4 组仅大小写不同的生成文件。在 macOS 默认的大小写不敏感文件系统上克隆仓库时,Git 会报告路径冲突,并且工作树在刚克隆后立即出现二进制文件被修改:

warning: the following paths have collided ... and only one from the same
colliding group is in the working tree:

docs/public/avatars/KelvinF97.jpg
docs/public/avatars/kelvinf97.jpg
docs/public/avatars/Zerone-Agent.jpg
docs/public/avatars/zerone-agent.jpg
docs/public/badges/Post-training-of-LLMs.png
docs/public/badges/post-training-of-llms.png
docs/public/data/datawhalechina/repo/Post-training-of-LLMs.json
docs/public/data/datawhalechina/repo/post-training-of-llms.json

克隆完成后的状态:

 M docs/public/avatars/KelvinF97.jpg
 M docs/public/data/datawhalechina/repo/Post-training-of-LLMs.json

最小复现

在默认 APFS 配置的 macOS 上执行:

gh repo clone datawhalechina/members-visualization members-visualization
cd members-visualization
git status --short
git ls-files | python3 -c 'import sys,collections; paths=[line.strip() for line in sys.stdin]; groups=collections.defaultdict(list); [groups[path.casefold()].append(path) for path in paths]; print("\n".join(" | ".join(group) for group in groups.values() if len(group)>1))'

当前主分支 e163ba66 可稳定得到上述 4 组冲突。

数据核对

  • GitHub API 当前返回的 canonical 用户名为 kelvinf97zerone-agent
  • GitHub API 当前返回的 canonical 仓库名为 post-training-of-llms
  • members.csvmembers.json 当前只引用小写头像路径。
  • 两个 Zerone 头像 blob 相同,两个 badge blob 相同。
  • 两个 Post-training JSON 并不相同:旧大写路径停留在 119 Stars / 2025-12,新小写路径为 234 Stars / 2026-8。
  • scripts/fetch_members/fetch_members.py 按 API 返回的用户名直接生成头像文件名;scripts/fetch_organization/fetch_organization.py 按仓库名直接生成 JSON 文件名;生成流程没有清理同一逻辑标识的旧大小写路径。

因此,这不是纯展示问题:大小写不敏感文件系统无法同时表达两个 Git 路径,检出结果取决于覆盖顺序,旧数据可能覆盖新数据,同时让无改动工作树显示为已修改。

建议修复边界

建议至少:

  1. 删除当前未被数据引用的旧大小写文件;
  2. 增加一个无网络检查,按 casefold() 扫描 Git 跟踪路径,防止再次提交大小写冲突;
  3. 如维护者希望从生成源头解决,可在头像和仓库数据写入前迁移或删除同一逻辑标识的旧大小写路径,并同步清理对应 badge。

第三项会影响自动生成文件的生命周期,想先确认维护者更倾向于“清理 + 守卫”还是“生成器主动迁移”,再提交 Draft PR。

验证边界

本次已核对 Git index、blob 哈希、当前 JSON 引用、生成脚本和 GitHub API canonical 名称;尚未修改代码,也未在 Linux CI 中重跑完整每日数据生成。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions