使用git filter-branch
彻底删除git中的文件(包括历史提交记录)
(1)查看存储库中的大文件:
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -15 | awk '{print$1}')"
(2)改写历史,去除大文件:
注意:下方命令中的
path/to/large/files
是大文件所在的路径,千万不要弄错!
Git这么强大,肯定是存在可以永久删除历史记录的命令,找了一圈,发现确实有“后悔药”命令,那就是git filter-branch,通过以下命令,就可以永久删除你想要删除的任何文件,
- 比如:
path/to/large/files
替换成IPADir/Debug/Lhahahahagolf.ipa
4cb60a1eec75fbca3662f6721095c2 IPADir/Debug/Lhahahahagolf.ipa
9f9ec0b483fe8465a818c8f0eb18d6 IPADir/Debug/Lhahahahagolf.ipa
1bf776b4d09e2291b9d6ac8656ea1 Pods/AMapLocation-NO-IDFA/AMapLocationKit.framework/AMapLocationKit
git filter-branch --tree-filter 'rm -f path/to/large/files' --tag-name-filter cat -- --all
将path/to/large/files
替换为删除文件的相对路径,并执行,如果有以下执行反馈Ref 'refs/heads/master' was rewritten
,说明删除成功了。
如果在 git filter-branch
操作过程中遇到如下提示,需要在 git filter-branch
后面加上参数 -f
(出现这个错误的原因是,第一次操作成功后发现仓库大小并没有减少(可能还增大了),便进行了第二次操作)
提示:
Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f
// 需要在 `git filter-branch` 后面加上参数 `-f`
git filter-branch -f --tree-filter 'rm -f IPADir/Debug/Lhahahagolf.ipa' --tag-name-filter cat -- --all
并告知所有组员,push 代码前需要 pull rebase
,而不是 merge
,否则会从该组员的本地仓库再次引入到远程库中,导致仓库在此被 Gitee 系统屏蔽。
(3)这样的删除并不彻底,随时可以恢复文件。
// 但这样的删除并不彻底,随时可以恢复文件。
$ git reset refs/original/refs/heads/master --hard
or
$ git reflog&&git checkout $commit-SHA1
(4)因此,需要在步骤(2)git filter-branch之后,继续执行:
$ git filter-branch -f --tree-filter "rm -f config/test.c" # 个人更使用喜欢参数为--index-filter,--all filtered all refs; --tag-name-filter cat 删除原始tag
<br>#回收内存的操作
$ rm .git/refs/original/refs/heads/master # $ rm .git/refs/original 删除git的备份
$ git reflog expire --all --expire=now #使所有散落的object失效
$ git fsck --unreachable #检查是否有散落的object, 验证数据库中对象的连接性和有效性
$ git gc --prune=now #git的垃圾清理车最终删除那些对象 git gc --aggressive --prune=now , --aggressive 此选项将导致git gc更积极地优化存储库,但代价是花费更多时间。\<br>--prune=<date> Prune loose objects older than date 修剪比日期更早的松散物体。可以在此之前执行 git repack -A -d 在存储库中打包解压缩的对象。 删除冗余的对象$ git fsck #检查是否还有对应的object,现在已经找不到提交的sha1了
(5)查看文件大小
du -ah .git/objects
(6) 项目根目录 隐藏文件.git
文件占用存储空间变小了:(command + shift + .
)点:“.”
执行以上命令,就会发现.git目录变小了。那么接下来只要把本地的记录,强制更新到远程仓库就行了。
(7)强制推到仓库: 提交变动
注意:强制更新是一个非常危险的动作,一定要确保你的本地内容是最新的,已经没有人在你之后提交了代码,否则会将其它的人提交的代码也一并删除了。
$ git push origin --tags --force
$ git push origin --all --force
# 其中master为你要推送的分支
// git push origin master --force
网友评论