git多次添加而不提交

时间:2019-01-26 07:09:42

标签: git

我注意到,如果我在仓库中编辑文件,暂存但不提交,再次编辑,暂存但不提交等,则每次执行此操作都会拍摄一个新快照并且磁盘空间增加。

此外,如果我在进行细微的编辑后上演5次,然后在所有登台之后最后一次 commit 一次,则回购的磁盘空间仍会增加大约5倍的文件大小。

我的问题是,如果只有最新的阶段版本具有对状态的提交sha1引用,为什么git不会仅仅忘记其他阶段版本?其他4个分阶段版本将被垃圾回收吗?有没有办法检查从未提交过的暂存状态?

1 个答案:

答案 0 :(得分:6)

TL; DR

请参见git fsck --lost-found

更长,逐点

  

我的问题是,如果只有最新的版本具有对状态的提交sha1引用,为什么git不会仅仅忘记其他阶段的版本?

最终会...

  

其他4个暂存版本将被垃圾回收吗?

是的,当git gc最终自动运行时。如果您希望这种情况早日发生,您可以自己运行git gc,但是几乎没有任何理由要打扰(常见的情况是 oops,我并不是故意git add 10terabytes.db )。 1

  

有没有办法检出从未提交过的暂存状态?

排序。 git checkout命令无法执行此操作,因为git checkout通过 file 名称起作用,并且这些暂存的仅内容内容的blob没有文件名。他们只有一个哈希ID。要提取其数据,必须首先找到其哈希ID。这很容易做到:您只需按照Git的方式对数据进行校验和,这仅意味着您需要首先获取数据才能获取数据。 :-)

或者,您可以执行git gc的大部分工作,即:

  • 枚举对象数据库中的每个对象ID。
  • 枚举每个 reachable 对象ID。有关可达性的详细信息,请参见Think Like (a) Git。请注意,这里的可达性包括所有引用的所有reflog条目,以及所有活动工作树的所有索引和HEAD条目。 2
  • 从第一组ID(所有)中减去第二组对象ID(可到达)。产生的ID未引用,即作为垃圾回收候选对象的对象。

(这有点慢,但是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。