Golang中如何从Git删除大文件

Golang中如何从Git删除大文件 三天前,我犯了个愚蠢的错误,向项目中添加了一个215MB的文件,并把它纳入了版本控制系统。

它被推送到了GitHub。在那里我看到了它原始的大小。

之后我尝试删除它并推送,但一直收到推送失败的消息,提示文件超过了100MB的限制。

我在本地仓库中看不到这个文件,但我猜它是在尝试推送我之前添加该文件的提交。(我不明白它当初是怎么传到GitHub的,不过……)。

我只想把它从所有地方彻底删除,然后继续我的项目。

任何建议都将不胜感激。

我不想在上面的描述中罗列我所有尝试纠正此问题的操作,以免显得杂乱。我尝试过增加缓冲区大小、安装LFS(并将现有文件迁移到LFS),至少这解决了“RPC失败,远程意外挂断”的错误。

我也尝试过在GitHub上直接编辑文件,将其缩减到几个字节,但无济于事。

所以我卡住了。

我看到一个建议是克隆项目,但我只想把它作为最后的手段(这真的有用吗?)。

最后,正如我提到的,我增加了post缓冲区的大小——我该如何将其恢复为默认大小?(我想我应该这么做???)。

谢谢。

附注:我是在Windows 11机器上通过GoLand进行操作的。


更多关于Golang中如何从Git删除大文件的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复
git reset --hard xxxx
git push origin xxxx --force

与其尝试向 Git 记录添加操作,不如尝试回滚。

更多关于Golang中如何从Git删除大文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个典型的Git大文件问题,需要从Git历史中彻底删除大文件。以下是解决方案:

1. 首先备份你的仓库

cd /path/to/your/repo
git clone --mirror . ../backup-repo

2. 使用BFG Repo-Cleaner(推荐)

下载BFG:https://rtyley.github.io/bfg-repo-cleaner/

# 创建裸仓库
git clone --mirror https://github.com/yourusername/yourrepo.git

# 删除大文件(替换your-large-file.ext为你的文件名)
java -jar bfg.jar --strip-blobs-bigger-than 100M yourrepo.git

# 或者删除特定文件
java -jar bfg.jar --delete-files your-large-file.ext yourrepo.git

# 清理并重新打包
cd yourrepo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive

# 强制推送到远程
git push --force

3. 使用git filter-branch(如果BFG不可用)

# 查找大文件
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

# 从所有提交中删除文件
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch path/to/your-large-file.ext" \
  --prune-empty --tag-name-filter cat -- --all

# 清理本地引用
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now

# 强制推送
git push origin --force --all
git push origin --force --tags

4. 对于团队协作的情况

# 通知所有团队成员
# 让他们执行:
git fetch --all
git reset --hard origin/main  # 或你的分支名

5. 恢复post缓冲区大小

# 查看当前配置
git config --global --get http.postBuffer

# 恢复默认(通常为1MB)
git config --global http.postBuffer 1048576

# 或者完全删除该配置
git config --global --unset http.postBuffer

6. 验证清理结果

# 检查仓库大小
git count-objects -vH

# 验证文件已从历史中删除
git log --all --full-history -- path/to/your-large-file.ext

重要注意事项:

  1. 强制推送会重写历史,确保你是唯一的工作者,或已通知团队成员
  2. 清理后需要所有协作者重新克隆仓库
  3. GitHub上的Pull Request可能会受到影响

GoLand中的操作:

在GoLand的终端中执行上述命令,或使用:

  • VCS → Git → Push(勾选"Force Push")
  • VCS → Git → Repository → GC

如果问题仍然存在,考虑在GitHub上创建新仓库并重新推送清理后的版本。

回到顶部