通过清除存储库历史记录git可用磁盘空间

Col*_*acX 14 git

所以我和一些朋友一起工作,我们都是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
Run Code Online (Sandbox Code Playgroud)

显而易见的解决方案是创建一个新的存储库,然后将自述文件复制到新的存储库中.但是,如果有GIT命令可以做到这一点,我想学习教育/好奇心.

我一直在试验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
Run Code Online (Sandbox Code Playgroud)

看起来本地存储库历史记录不希望缩小磁盘大小.但是,再次克隆存储库会显示所需的结果和磁盘大小.存储库日志也是如此.

感谢您的回复.有趣的Rebase似乎非常强大.

Tob*_*obu 10

重新绑定(git rebase -i --root如果你没有恢复错误的提交只是删除它的行,如果你这样做,用恢复提交压缩坏提交)或使用filter-branch将清除你的分支历史记录中的数据,但不会使它完全从存储库中消失.

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

克隆已过滤的repo不会克隆隐藏的数据,您也可以使用以下命令将其删除:

git reflog expire --all --expire-unreachable=now
git gc --aggressive --prune=now
Run Code Online (Sandbox Code Playgroud)

通常不建议使用这些命令,并且未引用的提交无论如何都会在30天后到期,但由于您的存储库几乎是新的,因此您不会冒太多风险.