gpt4 book ai didi

git - 如何从 Git 的历史记录中永久删除提交?

转载 作者:太空狗 更新时间:2023-10-29 13:07:51 28 4
gpt4 key购买 nike

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

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

最佳答案

从 checkout 中删除文件

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 服务器上恢复空间

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

$ ssh git server
$ cd /my/project/repo.git
$ git gc --prune=now

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

队友

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

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

第一个很简单,第二个意思是两件事之一:

用户没有本地提交

$ 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com