Git 似乎保留了已添加但未提交的 blob
#> mkdir foo
#> cd foo
#> echo a > data.txt
#> git add data.txt
#> find .git/objects
.git/objects/58/7be6b4c3f93f93c489c0111bba5596147a26cb
好的,现在更改内容。
#> echo b > data.txt
#> git add data.txt
#> find .git/objects
.git/objects/61/780798228d17af2d34fce4cfbdf35556832472
.git/objects/58/7be6b4c3f93f93c489c0111bba5596147a26cb
我们不再需要了58/7be6b4c3f93f93c489c0111bba5596147a26cb
,对吗?
#> git commit -m 'first'
#> find ./git/objects
.git/objects/c0/eef182819e5c530c407ca17a24e39cb6682ed3
.git/objects/61/780798228d17af2d34fce4cfbdf35556832472
.git/objects/58/7be6b4c3f93f93c489c0111bba5596147a26cb
.git/objects/70/a6a81a455bea58166d60d21060b074d3271b6a
那位孤儿58/7be6b4c3f93f93c489c0111bba5596147a26cb
仍在那儿。
git add
我对很多文件进行了操作,但这些文件在提交之前发生了更改。我可以删除索引不再引用的 blob 吗?
答案1
我看不出您为什么不能这样做,而且 git 似乎也同意这一点:运行git fsck --unreachable
显示它为悬垂节点,
git prune --dry-run
表明它将被删除。
不过,我不会手动运行它(在正常的 repo/工作场景中) -git gc
命令正好有这个目的:(来自https://git-scm.com/docs/git-gc)
在当前存储库中运行许多管理任务,比如压缩文件修订(以减少磁盘空间并提高性能)以及删除可能由之前调用 git add 创建的无法访问的对象。
鼓励用户在每个存储库内定期运行此任务,以保持良好的磁盘空间利用率和良好的运行性能。