tem*_*pid 6 git git-rewrite-history
如何从Git的历史中永久删除提交?
该团队的一名开发人员意外地提交了一个200 MB的文件并将其推送到我们的Git服务器.它被删除了几天,但历史就在那里.我们的代码文件只有大约75 MB,我们有4个分支.由于200 MB文件提交,历史记录将保留,项目文件夹(特别是隐藏的.git文件夹)的大小已经膨胀到接近700 MB.如何从git中永久删除两个签到(提交大文件,删除大文件),就好像它从未发生过一样?如果重要的话,我正在使用`TortoiseGit.
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自行清理,可以在服务器上显式运行它:
$ ssh git server
$ cd /my/project/repo.git
$ git gc --prune=now
Run Code Online (Sandbox Code Playgroud)
比较存储库前后的大小-确保它是您期望的大小。如果将来任何时候它恢复为更大的大小-有人已将删除的提交推回存储库中(需要再次执行所有步骤)。
如果还有其他开发人员正在使用此存储库-他们将需要清理结帐。否则,当他们从存储库中提取并推动更改时,他们将重新添加已删除的文件,因为该文件仍在其本地历史记录中。有两种方法可以避免这种情况:
第一个很简单,第二个意味着两件事之一:
$ 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)
| 归档时间: |
|
| 查看次数: |
7140 次 |
| 最近记录: |