本地 `git push` 失败(GitHub 单文件上限 100MB)。
问题总结(可直接记录):
1. 现象
本地 `git push` 失败,原因是提交历史里包含了 `DiaryWebsite.Web/logs/` 下超过 100MB 的 `.log` 文件(GitHub 单文件上限 100MB)。
2. 约束
你已经有很多其他改动并且都 commit 了,不能简单回退提交。
3. 处理思路
不回退业务改动,只把大日志文件从 Git 历史中移除,并防止未来再次被提交。
4. 关键操作
- 在 `.gitignore` 中忽略日志文件(如 `DiaryWebsite.Web/logs/*.log`)。
- 用历史清理工具(`git filter-repo`)删除历史中的日志文件记录。
- 清理后发现远程 `origin` 丢失(报错:`'origin' does not appear to be a git repository`)。
- 重新添加远程:`https://github.com/jy02542317/Diary.git`。
- `git fetch origin --prune` 后,再执行
`git push -u origin main --force-with-lease` 成功。
5. 最终结果
远程 `main` 已成功更新(forced update),仓库恢复可正常 push/pull。
6. 经验与预防
- 日志、打包产物、大模型文件不要直接进 Git。
- 通过 `.gitignore` 提前屏蔽 `logs/*.log`。
- 大文件如需版本管理,使用 Git LFS。
- 一旦做了历史重写并 force push,需通知协作者同步分支。
```bash
# 1) 先备份一个分支(防止误操作)
git branch backup-before-clean-large-file
# 2) 忽略日志文件
echo DiaryWebsite.Web/logs/*.log >> .gitignore
git add .gitignore
git commit -m "chore: ignore log files"
# 3) 安装历史清理工具(若未安装)
pip install git-filter-repo
# 4) 从历史中移除 logs 下的 .log 文件
git filter-repo --force --path-glob "DiaryWebsite.Web/logs/*.log" --invert-paths
# 5) 重新添加远程(filter-repo 后可能丢失)
git remote add origin https://github.com/jy02542317/Diary.git
# 6) 检查远程是否配置成功
git remote -v
git remote get-url origin
# 7) 拉取远端引用,避免 force-with-lease 的 stale info
git fetch origin --prune
# 8) 强制推送清理后的 main(保留 lease 保护)
git push -u origin main --force-with-lease
```
你这次实际成功推送时的关键输出是:
- `branch 'main' set up to track 'origin/main'.`
- `main -> main (forced update)`