【问题标题】:Cleaning out unused blobs using git merge --squash followed by git gc?使用 git merge --squash 清除未使用的 blob,然后使用 git gc?
【发布时间】:2013-03-03 20:38:23
【问题描述】:

由于多年前签入了许多大 blob,我的存储库变得非常大。它们已在后续修订中被删除,不再需要,所以我现在应该可以清除对它们的任何引用。

我看到了一些关于使用 git filter-branch 的参考,但使用这个命令似乎很危险而且很笨拙,所以我尝试了这个:

git checkout --orphan new-master
git rm -rf --cached *
git merge --squash master
git branch -D master
git gc --prune=now

这不应该意味着在历史的任何时候创建并随后删除的任何内容都将被永久删除吗?

由于某种原因,它似乎不起作用 - 大小或多或少相同。

有什么建议吗?

【问题讨论】:

    标签: git git-filter-branch git-gc


    【解决方案1】:

    抱歉,filter-branch 是这样做的唯一方法。

    如果您感到紧张,您应该尝试在存储库的单独克隆中对其进行测试。请记住,当您执行此操作时,git 会为您备份所有内容,因此您克隆的存储库将在本地增加大小,直到您推送更改的历史记录。

    我会查看GitHub's useful page on this

    另外,请原谅我的无耻插件,我最近一直在研究Ruby gem,它提供了有关您的历史记录和工作副本中的大文件的一些基本指标。它仍在积极开发中,但它可以工作,希望您会发现它有用。

    编辑:为什么你的方法不起作用

    首先,git是一个distributed revision control system,这意味着当你做一个clone时,所有的分支和历史都会被复制到本地。因此,您可以对存储库历史记录中的任何提交执行git checkout <commit-sha>,以准确了解存储库在过去某个时间点的样子。

    创建一个新分支并不能将您从存储库的历史中解放出来;事实上,branches are just pointers to commits。所以为了简化,所有分支都有一个共同的祖先,这就是为什么你的new-master 分支与你的旧master 分支完全相同。大小的小幅减少可能是由于 git 从垃圾收集中获得了更好的优化。

    当您运行git gc --prune=now 时,您只是删除了loose objects,即不在您的packfile 中的对象。 packfile 是 git 有效存储对象的地方,以提高效率并减少存储库的大小。您可以找到更多信息here

    如果你是一个 git 新手,你需要接受很多东西,但我试图给出一个高层次的概述。我会探索优秀 git documentation 并准备好淘汰 git filter-branch 命令以真正减少存储库的大小。

    【讨论】:

    • “直到你推高更改的历史”不是真的。直到您按照您已经提供的参考资料中的“清理和回收空间”步骤操作。值得引用这些步骤。无论如何 +1。
    • 抱歉,这误导了我。就我个人而言,我从来没有费心遵循清理步骤;我只需对更改的存储库 (git clone file://<repo>) 进行文件系统克隆,以验证、推送到远程,然后从远程重新克隆。在第 2 步和第 3 步之间喝杯咖啡是可选的,但建议这样做:-)
    • 感谢您的回答 - 为什么我的方法不起作用?
    • 太好了,感谢您的回答,但我仍然感到困惑,因为在运行 git branch -D master 之后,我应该有效地删除了对提交的所有引用(除了新压扁的)? (当然是模标签和其他分支。)
    • 您正在考虑“传统”意义上的修订控制,例如SVN。 Git 对您的“文件”概念一无所知。每个提交都不是一个完全独立的静态文件集合;相反,git 将文件存储为blobs,并在随后的修订中映射差异(除此之外还有更多内容,但这是一个总体概述)。如果您想进一步证明,请切换到新的主分支并输入 git log --onelineoneline 是可选的,以便更清晰的输出)。你看到了什么?
    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多