删除gitignore修改前提交的大文件

How

当发现忘记将一个300M的文件加入了git而无法提交到github的时候,你只能通过gitignore补救,但由于已经被版本控制记录过,所以就算你在gitignore里加入了规则也无法push。

所以需要将版本控制中涉及的这个文件删掉,这个错误我已经犯过好多次了,毕竟并不是很容易注意到,在这里记录解决方案。

首先,在git仓库路径下

1
2
3
4
5
git rm -r --cache .

git add .

git commit -m ".gitignore now work"

但是这些还不够。

 

如果是要删掉指定文件

1
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 【文件路径】' --prune-empty --tag-name-filter cat -- --all

要删掉记录的文件的路径:src/main/resources/config/application-test.yml

则代码为:

1
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch src/main/resources/config/application-test.yml' --prune-empty --tag-name-filter cat -- --all

如果是要删掉指定文件夹

1
git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch 【文件夹路径】' --prune-empty --tag-name-filter cat -- --all

例如,要删掉记录的文件的路径:src/main/resources/config/

则代码为:

1
git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch src/main/resources/config/' --prune-empty --tag-name-filter cat -- --all

(删除文件夹代码中多一个**-r**,至于原因,学过Linux的都会懂)

 

最后推送到远端,本地记录覆盖到Github,(所有branch以及所有tags)

1
2
git push origin --force --all
git push origin --force --tags

可以考虑git-filter-repo:pip install git-filter-repo

参考

https://blog.csdn.net/bryce123phy/article/details/51324280?ydreferer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS5oay8%3D

https://www.only4.work/blog/?id=250