我正在寻找关于悬空提交和Blob的基本信息。
我的代码库似乎没问题。但是我第一次运行 git fsck
命令,看看它做了什么,然后我得到了一个很长的“悬空Blob”列表和单个的“悬空提交”。
这些东西是什么?它们从哪里来?它们是否表明我的代码库状态有任何异常(好或坏)?
我正在寻找关于悬空提交和Blob的基本信息。
我的代码库似乎没问题。但是我第一次运行 git fsck
命令,看看它做了什么,然后我得到了一个很长的“悬空Blob”列表和单个的“悬空提交”。
这些东西是什么?它们从哪里来?它们是否表明我的代码库状态有任何异常(好或坏)?
在使用 Git 仓库时,您可能会回退操作,进行其他移动,这会导致中间 blob 甚至是一些 Git 帮助您避免信息丢失的操作。
最终(有条件地,根据git gc 手册页面)将执行垃圾回收并清除这些内容。您也可以通过调用垃圾收集过程 git gc
来强制执行它。
有关此内容的更多信息,请参见 git-scm 站点上的Maintenance and Data Recovery。
手动运行 GC 默认会将该命令运行时间之前的两周留作安全网。实际上,偶尔运行 GC 有助于确保高效使用 Git 仓库。但是,在销毁可能对您重要的内容之前,您应该了解它正在做什么。
悬挂Blob = 一种在暂存区/索引中被更改了,但从未提交的内容。Git的一个惊人之处在于,一旦它被添加到暂存区,您总是可以将其恢复,因为这些Blob就像提交一样具有哈希值!
悬挂提交 = 没有任何子提交、分支、标签或其他引用直接链接的提交。您也可以将它们恢复回来!
如何从您的Git存储库中删除所有悬空提交,来源于https://web.archive.org/web/20210116144915/https://tekkie.ro/news/howto-remove-all-dangling-commits-from-your-git-repository/:
git reflog expire --expire=now --all
git gc --prune=now
请确保您真的想要删除它们,因为您可能最终决定需要它们。
git reflog
来恢复被删除但未合并的分支(悬挂提交)。只有在本地对象存储中存在时,才能恢复已删除的提交。如果已进行垃圾回收,则我们无法恢复它。
请注意,分支名称即分支标签实际上是对分支上最新提交或分支尖端的引用。在上面的图表中,featureX、master和HEAD只是对特定提交的引用。featureX和master标签分别指向它们各自分支上的最新提交。HEAD通常指当前检出分支的尖端(在本例中为master)。如果您检出当前分支上的早期提交,则HEAD将处于分离状态,即它会指向早期提交而不是最新提交。还要注意,HEAD被称为符号引用,因为它实际上指向当前分支标签,任何分支标签都始终指向分支的尖端。因此,在正常情况下,HEAD间接指向最新提交。
git gc
安全地删除这些东西;同时,因为这些悬空的部分是正常的,而且 Git 已经处理了它们,所以我无需担心。 - doub1ejack