git操作之git filter-branch --force --index-filter

背景:

        使用git管理的项目,在push时遇到问题,push前创建的文件太大,push失败,现在把本地的大文件删除了,还push不了。

分析:

        即使你从本地删除了大文件,Git 仍然保留了该文件在历史记录中,所以 push 的时候还是会尝试上传整个历史(包括那个大文件),从而失败。

解决方案:

        1. 确认文件是否真的从 Git 历史中删除

首先,请确认文件是否只是从本地删除,而没有从 Git 历史中真正移除。你可以运行以下命令查看历史记录中是否仍然包含该大文件:

git log --all --full-history -- "**/large_file_name"

qw MINGW64 /e/om/om (master)
$ git log --all --full-history -- "data/soft/ES/ela*"
commit 0a44e5af20c7c6558a7db22de22b90e526e1f6a1 (HEAD -> master)
Author: qq   <ww@******>
Date:   Thu Sep 25 08:28:25 2025 +0800

    ,文件太大,各安装包删除

commit 505eb05fd096350ddf14c3c9a9a1667072ddd3e3
Author: qq   <ww@******>
Date:   Wed Sep 24 16:30:51 2025 +0800

    ES安装及脚本文件

发现该文件仍然出现在历史中,接下来需要彻底从 Git 历史中移除它。

2. 使用 git filter-branch彻底删除历史中的大文件

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch path/to/large_file' --prune-empty --tag-name-filter cat -- --all

$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch data/soft/ES/ela*' --prune-empty --tag-name-filter cat -- --all
WARNING: git-filter-branch has a glut of gotchas generating mangled history
         rewrites.  Hit Ctrl-C before proceeding to abort, then use an
         alternative filtering tool such as 'git filter-repo'
         (https://github.com/newren/git-filter-repo/) instead.  See the
         filter-branch manual page for more details; to squelch this warning,
         set FILTER_BRANCH_SQUELCH_WARNING=1.
Proceeding with filter-branch...

Rewrite 505eb05fd096350ddf14c3c9a9a1667072ddd3e3 (11/17) (34 seconds passed, remaining 18 predicted)    rm 'data/soft/ES/elasticsearch-7.16.1-linux-x86_64.tar.gz'
Rewrite 64776e78a6af9b70339408d1abf489caf8905a06 (12/17) (38 seconds passed, remaining 15 predicted)    rm 'data/soft/ES/elasticsearch-7.16.1-linux-x86_64.tar.gz'
Rewrite 1ec174dfd8a22c8cbcaba0895dde814738c7128c (13/17) (41 seconds passed, remaining 12 predicted)    rm 'data/soft/ES/elasticsearch-7.16.1-linux-x86_64.tar.gz'
Rewrite c2fcbf01d1b9f7d8ed975c8fc30693411f64eba4 (14/17) (45 seconds passed, remaining 9 predicted)    rm 'data/soft/ES/elasticsearch-7.16.1-linux-x86_64.tar.gz'
Rewrite 47cf60040e80bfc5d2d715acc9a4251424546749 (15/17) (48 seconds passed, remaining 6 predicted)    rm 'data/soft/ES/elasticsearch-7.16.1-linux-x86_64.tar.gz'
Rewrite 8b9716c6ab6f3ba9ff0b93a5685293dcf88b8811 (16/17) (52 seconds passed, remaining 3 predicted)    rm 'data/soft/ES/elasticsearch-7.16.1-linux-x86_64.tar.gz'
Rewrite 0a44e5af20c7c6558a7db22de22b90e526e1f6a1 (17/17) (55 seconds passed, remaining 0 predicted)
Ref 'refs/heads/master' was rewritten
Ref 'refs/remotes/origin/master' was rewritten
WARNING: Ref 'refs/remotes/origin/master' is unchanged

再次查看结果:

3. 强制推送修改后的历史

清理完历史后,你需要强制推送到远程仓库(注意:这会重写远程历史,可能影响其他协作者):

git push origin --force

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值