我注意到,如果我在仓库中编辑文件,暂存但不提交,再次编辑,暂存但不提交等,则每次执行此操作都会拍摄一个新快照并且磁盘空间增加。
此外,如果我在进行细微的编辑后上演5次,然后在所有登台之后最后一次 commit 一次,则回购的磁盘空间仍会增加大约5倍的文件大小。
我的问题是,如果只有最新的阶段版本具有对状态的提交sha1引用,为什么git不会仅仅忘记其他阶段版本?其他4个分阶段版本将被垃圾回收吗?有没有办法检查从未提交过的暂存状态?
答案 0 :(得分:6)
我的问题是,如果只有最新的版本具有对状态的提交sha1引用,为什么git不会仅仅忘记其他阶段的版本?
最终会...
其他4个暂存版本将被垃圾回收吗?
是的,当git gc
最终自动运行时。如果您希望这种情况早日发生,您可以自己运行git gc
,但是几乎没有任何理由要打扰(常见的情况是 oops,我并不是故意git add 10terabytes.db
)。 1
有没有办法检出从未提交过的暂存状态?
排序。 git checkout
命令无法执行此操作,因为git checkout
通过 file 名称起作用,并且这些暂存的仅内容内容的blob没有文件名。他们只有一个哈希ID。要提取其数据,必须首先找到其哈希ID。这很容易做到:您只需按照Git的方式对数据进行校验和,这仅意味着您需要首先获取数据才能获取数据。 :-)
或者,您可以执行git gc
的大部分工作,即:
HEAD
条目。 2 (这有点慢,但是git fsck
为您做到了,因此您不必编写代码即可做到。)
从所有无法访问的对象的集合中,选择类型为 blob 的对象,即git add
有文件但从未提交的文件。检查每个Blob,使用其哈希ID对其进行访问,以查看它是否是您想要的。在这里git cat-file -p
是有用的,或者使用git fsck --lost-found
来获取每个这样的blob,对其进行解压缩,然后将数据写入.git/lost-found/other/
中的普通文件中。
1 请注意,您可能还需要--prune=
选项:git gc
默认为给其他Git进程14天的时间来完成连接对象的工作。如果您使用--prune=all
,请确保没有其他Git活动发生。
2 当您记得包括通过git worktree add
添加的工作树时,您将做Git员工忘记做的事情。这是一个特别令人讨厌的错误,存在于Git版本2.5到2.14。*中:*如果您将工作树闲置了2个,则可以通过自动git gc
修剪添加的工作树中的工作。个星期或更长时间。如果您使用的是git worktree add
,建议您确保自己的Git版本至少为2.15。