从结帐中删除文件
Github 有一个有用的页面如何从存储库中永久删除文件,简而言之:
$ git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch 200MB-filename' \
--prune-empty --tag-name-filter cat -- --all
$ git push --all -f
这将从所有分支中删除该文件。然后在本地恢复空间:
$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --prune=now
恢复 git 服务器上的空间
强制推送不会删除远程服务器上的任何提交/对象。如果您不想等待 git 自行清理,可以在服务器上显式运行它:
$ ssh git server
$ cd /my/project/repo.git
$ git gc --prune=now
比较之前和之后的 repo 大小 - 确保它是您期望的大小。如果在未来的任何时候它恢复到更大的大小 - 有人已将已删除的提交推回存储库(需要再次执行所有步骤)。
队友
如果有其他开发人员使用此存储库 - 他们将需要清理他们的结帐。否则,当他们从存储库中提取并推送他们的更改时,他们将添加回已删除的文件,因为它仍在其本地历史记录中。有两种方法可以避免:
- 再次克隆
- 获取并重置
第一个很简单,第二个意味着两件事之一:
用户没有本地提交
$ git fetch
$ git reset origin/master -hard
这将使任何本地结帐完全匹配远程
用户确实有本地提交
$ git fetch
$ git rebase -i origin/master
用户需要确保他们没有任何引用删除文件的本地提交 - 否则他们会将其添加回存储库。
用户清理
然后(可选,因为 git 不会将未引用的提交推送到服务器)恢复空间,每个人都有一个一致的更苗条的存储库状态:
$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --prune=now