- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如何从 Git 的历史记录中永久删除提交?
团队中的一位开发人员不小心提交了一个 200 MB 的文件并将其推送到我们的 Git 服务器。几天后它被删除了,但历史记录在那里。我们的代码文件只有 75 MB 左右,我们有 4 个分支。由于 200 MB 的文件提交,历史被保留,我们的项目文件夹(特别是 stash 的 .git 文件夹)的大小已经膨胀到接近 700 MB。如何从 git 中永久删除两次 checkin (提交大文件,删除大文件),就好像它从未发生过一样?如果重要的话,我正在使用 `TortoiseGit。
最佳答案
Github 上有一个 useful page如何从存储库中永久删除文件,简而言之:
$ 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 自行清理,你可以在服务器上显式运行它:
$ ssh git server
$ cd /my/project/repo.git
$ git gc --prune=now
比较前后 repo 的大小 - 确保它是您期望的大小。如果在将来的任何时候它恢复到更大的大小 - 有人将已删除的提交推回存储库(需要重新执行所有步骤)。
如果有其他开发人员使用此存储库 - 他们将需要清理他们的 checkout 。否则,当他们从存储库中 pull 并推送他们的更改时,他们将添加回已删除的文件,因为它仍在他们的本地历史记录中。有两种方法可以避免这种情况:
第一个很简单,第二个意思是两件事之一:
$ git fetch
$ git reset origin/master -hard
这将使任何本地 checkout 与远程 checkout 完全匹配
$ git fetch
$ git rebase -i origin/master
用户需要确保他们没有任何引用删除文件的本地提交 - 否则他们会将其添加回存储库。
然后(可选,因为 git 不会将未引用的提交推送到服务器)恢复空间,每个人都有一个一致的更 slim 的存储库状态:
$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --prune=now
关于git - 如何从 Git 的历史记录中永久删除提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18010048/
我是一名优秀的程序员,十分优秀!