当你从 Git 仓库中删除了大文件,但仍然无法推送时,可能是因为这些大文件仍然存在于 Git 的历史记录中。Git 的历史记录会保留所有提交的更改,即使你在后续的提交中删除了文件,这些文件仍然会存在于历史记录中。
要彻底从 Git 仓库中删除大文件,你需要从历史记录中移除它们。以下是一些步骤,帮助你从 Git 历史记录中删除大文件,并成功推送到远程仓库。
git filter-branch
(不推荐)git filter-branch
是一个强大的工具,但它有一些缺点,比如速度慢和容易出错。尽管如此,这里是一个示例:
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch path/to/largefile' \
--prune-empty --tag-name-filter cat -- --all
BFG Repo-Cleaner
(推荐)BFG Repo-Cleaner
是一个更快、更简单的工具,用于从 Git 仓库中删除大文件或敏感数据。你可以按照以下步骤使用它:
你可以从 BFG Repo-Cleaner 的 GitHub 页面 下载 BFG Repo-Cleaner 的 jar 文件。
假设你已经下载了 bfg.jar
文件,并且你想要删除大于 100MB 的文件:
# 删除大于 100MB 的文件
java -jar bfg.jar --strip-blobs-bigger-than 100M my-repo.git
或者,如果你知道具体的文件路径:
# 删除特定文件
java -jar bfg.jar --delete-files 'path/to/largefile' my-repo.git
运行 BFG Repo-Cleaner 后,你需要清理和推送更改:
# 进入你的仓库目录
cd my-repo
# 清理仓库
git reflog expire --expire=now --all && git gc --prune=now --aggressive
# 强制推送更改到远程仓库
git push origin --force --all
git push origin --force --tags
git filter-repo
(推荐)git filter-repo
是一个新的工具,旨在替代 git filter-branch
,并且更快、更易用。你可以按照以下步骤使用它:
git filter-repo
你可以使用 pip
安装 git filter-repo
:
pip install git-filter-repo
git filter-repo
删除大文件假设你想要删除特定文件:
git filter-repo --path path/to/largefile --invert-paths
运行 git filter-repo
后,你需要清理和推送更改:
# 清理仓库
git reflog expire --expire=now --all && git gc --prune=now --aggressive
# 强制推送更改到远程仓库
git push origin --force --all
git push origin --force --tags
通过这些步骤,你应该能够从 Git 仓库中彻底删除大文件,并成功推送到远程仓库。
领取专属 10元无门槛券
手把手带您无忧上云