问题描述
仓库当前跟踪了 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 用户名为
kelvinf97、zerone-agent。
- GitHub API 当前返回的 canonical 仓库名为
post-training-of-llms。
members.csv 与 members.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 路径,检出结果取决于覆盖顺序,旧数据可能覆盖新数据,同时让无改动工作树显示为已修改。
建议修复边界
建议至少:
- 删除当前未被数据引用的旧大小写文件;
- 增加一个无网络检查,按
casefold() 扫描 Git 跟踪路径,防止再次提交大小写冲突;
- 如维护者希望从生成源头解决,可在头像和仓库数据写入前迁移或删除同一逻辑标识的旧大小写路径,并同步清理对应 badge。
第三项会影响自动生成文件的生命周期,想先确认维护者更倾向于“清理 + 守卫”还是“生成器主动迁移”,再提交 Draft PR。
验证边界
本次已核对 Git index、blob 哈希、当前 JSON 引用、生成脚本和 GitHub API canonical 名称;尚未修改代码,也未在 Linux CI 中重跑完整每日数据生成。
问题描述
仓库当前跟踪了 4 组仅大小写不同的生成文件。在 macOS 默认的大小写不敏感文件系统上克隆仓库时,Git 会报告路径冲突,并且工作树在刚克隆后立即出现二进制文件被修改:
克隆完成后的状态:
最小复现
在默认 APFS 配置的 macOS 上执行:
当前主分支
e163ba66可稳定得到上述 4 组冲突。数据核对
kelvinf97、zerone-agent。post-training-of-llms。members.csv与members.json当前只引用小写头像路径。scripts/fetch_members/fetch_members.py按 API 返回的用户名直接生成头像文件名;scripts/fetch_organization/fetch_organization.py按仓库名直接生成 JSON 文件名;生成流程没有清理同一逻辑标识的旧大小写路径。因此,这不是纯展示问题:大小写不敏感文件系统无法同时表达两个 Git 路径,检出结果取决于覆盖顺序,旧数据可能覆盖新数据,同时让无改动工作树显示为已修改。
建议修复边界
建议至少:
casefold()扫描 Git 跟踪路径,防止再次提交大小写冲突;第三项会影响自动生成文件的生命周期,想先确认维护者更倾向于“清理 + 守卫”还是“生成器主动迁移”,再提交 Draft PR。
验证边界
本次已核对 Git index、blob 哈希、当前 JSON 引用、生成脚本和 GitHub API canonical 名称;尚未修改代码,也未在 Linux CI 中重跑完整每日数据生成。