我在我的当前文件和外部驱动器上的文件备份之间运行了一个差异检查器,我发现git repo和它的备份之间有一些差异。唯一的区别是左边的.git/objects下有一些额外的文件,右边有两个空白的.git-objects/info和.git/oobjects/pack文件夹。我在两边做了一个快速的git show
和git log
,得到了相同的输出。
然后我做了一个git fsck --no-reflogs
,在左侧发现了一个额外的悬空提交。git ls-tree
在我完成额外提交的过程中,给了我一堆树和斑点,这些树和斑点只占了左侧的一个额外文件。
在最后一个文件上使用git cat-file -t <sha1>
告诉我这是一棵树。然而,我在每次提交时都使用了git ls-tree
,但仍然没有发现对这个神秘树对象的引用。那么这个文件到底是从哪里来的呢?我有99.99%的把握这没关系,只是好奇:P
meh,新手失误。原来,额外的悬空提交直接指向丢失的树。我原以为对提交对象执行git ls-tree <sha1>
会得到它所指向的树,但实际上它会给出它所指向树的子树。使用git cat-file -p <sha1>
来查找对象内容,给了我所需的信息。
因此,.git/objects中的所有文件似乎都是提交或悬挂提交。我发现这是git对象如何工作的一个非常简洁的指南。