如何从Git的历史中永久删除提交?

tem*_*pid 6 git git-rewrite-history

如何从Git的历史中永久删除提交?

该团队的一名开发人员意外地提交了一个200 MB的文件并将其推送到我们的Git服务器.它被删除了几天,但历史就在那里.我们的代码文件只有大约75 MB,我们有4个分支.由于200 MB文件提交,历史记录将保留,项目文件夹(特别是隐藏的.git文件夹)的大小已经膨胀到接近700 MB.如何从git中永久删除两个签到(提交大文件,删除大文件),就好像它从未发生过一样?如果重要的话,我正在使用`TortoiseGit.

AD7*_*six 5

从结帐中删除文件

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
Run Code Online (Sandbox Code Playgroud)

这将删除所有分支中的文件。然后在本地恢复空间:

$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --prune=now
Run Code Online (Sandbox Code Playgroud)

在git服务器上恢复空间

力推也不会删除任何提交远程服务器上/对象。如果您不想等待git自行清理,可以在服务器上显式运行它:

$ ssh git server
$ cd /my/project/repo.git
$ git gc --prune=now
Run Code Online (Sandbox Code Playgroud)

比较存储库前后的大小-确保它是您期望的大小。如果将来任何时候它恢复为更大的大小-有人已将删除的提交推回存储库中(需要再次执行所有步骤)。

队友

如果还有其他开发人员正在使用此存储库-他们将需要清理结帐。否则,当他们从存储库中提取并推动更改时,他们将重新添加已删除的文件,因为该文件仍在其本地历史记录中。有两种方法可以避免这种情况:

  1. 再次克隆
  2. 获取并重置

第一个很简单,第二个意味着两件事之一:

用户没有本地提交

$ git fetch
$ git reset origin/master -hard
Run Code Online (Sandbox Code Playgroud)

这将使任何本地结帐与远程结帐完全匹配

用户确实有本地提交

$ git fetch
$ git rebase -i origin/master
Run Code Online (Sandbox Code Playgroud)

用户需要确保没有引用删除文件的本地提交-否则他们会将其添加回存储库中。

用户清理

然后(可选,因为git不会将未引用的提交推送到服务器)恢复空间,并且每个人都具有一致的更瘦的存储库状态:

$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --prune=now
Run Code Online (Sandbox Code Playgroud)


for*_*dya 2

您可以使用 git filter-branch。请注意,这涉及历史重写,并且所有克隆都需要重新创建。您可以在 Pro Git 书中找到对该主题的详细介绍。