Day_02
今天上午 一直在看demo的代码,熟悉rebolt交互逻辑,cursor生成的太慢了,同时还在尝试着把demo通过cursor或Xcode跑起来,一直没有解决,一直在用ai跑。
感觉有问题还是要及时和别人交流,这样的 信息不够的bug没有意义,该问就问,毕竟是工作不是竞技,合作提效为先。
下午在配置Typora,磨刀不误砍柴工,再紧张也不差这点时间,不要急。
还给learder讲了一下,demo的交互,感觉还是不能太抱有侥幸心理,要实打实得搞明白才行。leader也说这个掌握程度不太行,还得慢慢来。 现在给我安排的任务是学习打包。
打包也遇到了很多问题,对于一个庞大的项目,拉取时要递归拉取子模块,不能简单得 git pull,同时有些第三方库非常得庞大,需要用到git lfs,而这些lfs 的配置又在子模块中,直接在根目录 lfs也不行,也需要递归 lfs!
今日总结,不会多问,合理使用 ai,不能有了代理,就傻瓜式点击,不要急,慢慢来,慢下来反而能提效,心里越急,越不能静下心来分析问题,越容易无效忙碌。
明确目标,明确方法!
问题 1:LFS 指针文件未替换为真实内容 你在构建过程中发现某些文件(如 sqlite3.c 和静态库 .a 文件)显示为 Git LFS 指针文件 内容(version https://git-lfs 开头)。
原因 这些文件被 LFS 管理,但实际内容(大文件)没有被拉取和替换。 .gitattributes(定义哪些文件走 LFS 管理的配置)缺失,或者对应仓库/子模块没有正确运行 git lfs pull。 解决方法 确保本机已安装 Git LFS,并启用了 LFS:
brew install git-lfs
git lfs install
在主仓库和子模块下分别运行:
git submodule update --init --recursive
git submodule foreach --recursive 'git lfs install && git lfs pull && git lfs checkout'
验证关键文件是否已变成真实内容:
bash
head -n 3 Libraries/cocos2d/external/sqlite3/sqlite3.c
head -n 3 Libraries/cocos2d/external/protobuf/prebuilt/mac/libprotobuf-lite.a
清理构建目录并重新编译:
bash
rm -rf build
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build -j 10
问题 2:子模块中的 LFS 文件没有拉下 在你解决主仓库的 LFS 问题后,静态库文件(.a)仍然是指针,这是因为:
主仓库的 LFS 拉全和子模块无关,每个子模块需要分别 git lfs pull。 解决方法 进入具体子模块,执行:
bash
cd Libraries/cocos2d
git lfs pull
git lfs checkout
对所有子模块一键操作 LFS:
bash
git submodule foreach --recursive 'git lfs install && git lfs pull && git lfs checkout'
包含嵌套子模块且使用 Git LFS 管理大文件的仓库,解决手动逐个处理的繁琐问题 如果某些子模块的 LFS 拉取失败,查看具体报错(通常是认证或权限问题)。
问题 3:编译报错 - 静态库 .a 文件类型未知 链接阶段报错 unknown file type,因为:
这些 libxxx.a 文件仍是 LFS 指针文件,导致链接器当作文本处理。 LFS 未正确 checkout 到子模块的真实文件内容。 解决方法 对项目反馈:
按 问题 2 的解决步骤,对子模块的 LFS 拉取与 Checkout 操作。 验证 .a 文件是否正常:
bash
file Libraries/cocos2d/external/protobuf/prebuilt/mac/libprotobuf-lite.a
问题 4:LFS 无法自动替换文件,缺少 .gitattributes 一度发现主仓库没 .gitattributes,导致文件未被认为是 LFS 管理的对象。
解决方法 补充/修正主仓库的 .gitattributes:
创建 .gitattributes 文件:
bash
echo "Libraries/cocos2d/external/sqlite3/sqlite3.c filter=lfs diff=lfs merge=lfs -text" > .gitattributes
git add .gitattributes
再次运行 git lfs pull 和 git lfs checkout。
知识点总结
- 什么是 Git LFS? LFS(Large File Storage)是 Git 的扩展,用于管理大文件(如图片、二进制库),通过存储指针文件在 Git 仓库中,将实际内容存储在独立的 LFS 后端服务器中。
指针文件格式(三行内容):
Code
version https://git-lfs.github.com/spec/v1
oid sha256:<文件的唯一标识>
size <原始文件大小>
- .gitattributes 的作用 定义哪些文件应用 LFS 规则:
plaintext
*.png filter=lfs diff=lfs merge=lfs -text
Libraries/cocos2d/external/sqlite3/sqlite3.c filter=lfs diff=lfs merge=lfs -text
缺失 .gitattributes 会导致文件无法被 Git 认为是 LFS 管理的对象,即使远端存储了 LFS 文件内容。
- 子模块与主仓库的 LFS 管理是独立的 对主仓库的 git lfs pull 不影响子模块。 子模块需要单独初始化和拉取 LFS:
bash
git submodule update --init --recursive
git submodule foreach --recursive 'git lfs pull && git lfs checkout'
- 常用 Git LFS 命令 安装 LFS:
bash
git lfs install
拉取当前仓库的 LFS 文件:
bash
git lfs pull
在当前目录的子模块递归操作:
bash
git submodule foreach --recursive 'git lfs pull && git lfs checkout'
检查 LFS 配置和已跟踪文件:
bash
git lfs env
git lfs ls-files
- 静态库(.a 文件)链接错误的常规排查 确认文件类型:
如果是 LFS 指针:
bash
head -n 3 path/to/libxxx.a
检查静态库架构(是否 arm64 / x86_64 不匹配):
bash
file path/to/libxxx.a
lipo -info path/to/libxxx.a
清除缓存重新链接: 一旦 LFS 指针文件被替换,必须重新清理编译:
bash
rm -rf build
cmake -B build -DCMAKE_BUILD_TYPE=DEBUG
cmake --build build
