本地 `git push` 失败(GitHub 单文件上限 100MB)。

编程技巧 网站经验
📅 2026-03-21 20:19 👤 admin

问题总结(可直接记录):

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)`