通过清除存储库历史记录来释放 git 磁盘空间

标签 git

所以我和一些 friend 一起工作,我们都是 git 的新手,其中一个提交了大量外部二进制文件,这会减慢存储库的速度,并占用大量磁盘空间。

我们刚刚开始这个项目,所以除了自述文件外,没有什么重要的东西。所以我们想要做的是清除存储库历史到当前状态。

So basicly it looks this:

Head -> A -> B -> C    total disk size 45 MB, 1 file, 300 deleted files

And we want this:

Head -> A              total disk size 1 kB, 1 file, 0 deleted files

显而易见的解决方案是创建一个新的存储库并将自述文件复制到新的存储库中。但是,如果有可以执行此操作的 GIT 命令,我想学习教育/好奇心。

我一直在尝试使用 rebase 命令,但它似乎仍然保留着旧的历史记录和它们的数据,这让我感到困惑,因为如果 rebase 不从存储库中删除数据,那么您也可能不会使用它。

我一直在谷歌搜索关于这个问题的一些其他帖子,我怀疑你不能用 git 做到这一点。不过我想确认一下。

是的,它是 github 上的一个远程目录

感谢您的帮助。

所以对于我的解决方案,我选择这样做:

rebase using tortoisegit
squash all commits
then using git bash:
git reflog expire --all --expire-unreachable=now
git gc --aggressive --prune=now
git push origin master --force

本地存储库历史记录似乎并不想缩小磁盘大小。但是,再次克隆存储库会显示所需的结果和磁盘大小。存储库日志也是如此。

感谢您的有用回复。有趣的 Rebase 看起来很强大。

最佳答案

rebase (git rebase -i --root,如果你没有恢复错误的提交,只需删除它的行,如果你这样做了,用恢复提交压缩错误的提交)或使用过滤器-branch 将从您的分支历史记录中清除数据,但不会使其完全从存储库中消失。

这是因为,出于安全和可追溯性的原因,git 保留了一个 reflog(通过 git log -g 可见)来跟踪您所做的每个提交,无论它是否仍然是祖先图的一部分。

克隆过滤后的 repo 不会克隆 stash 数据,您也可以使用以下命令就地删除它:

git reflog expire --all --expire-unreachable=now
git gc --aggressive --prune=now

通常不推荐使用这些命令,而且未引用的提交无论如何都会在 30 天后过期,但由于您的存储库实际上是新的,因此您不会冒太大风险。

关于通过清除存储库历史记录来释放 git 磁盘空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16057391/

相关文章:

git - 如何为 git diff 启用通配 rune 件路径?

Git 在不克隆的情况下获取标记文件

用于使自定义修改的开源软件保持最新的 git 工作流程?

git - 2次提交之间的所有提交列表

git - 如何撤消 git commit --amend

git - 如何进行永久本地提交或更改

git - 如何对大量提交进行 rebase

git - 使现有文件夹成为 git 子树

html - .gitignore 父文件夹中的文件

git - 如何将简单的非源代码控制的项目备份转换为版本化的 git 存储库?