2015-02-23 95 views
1

我在當前的文件和外部驅動器上的文件備份之間運行差異檢查器,並且發現git repo和它的備份之間存在一些差異。唯一的區別是左側的.git/objects下有一些額外的文件,右側有兩個空白的.git/objects/info和.git/objects/pack文件夾。我在兩側快速執行了git showgit log,這給出了相同的輸出。Git找不到懸掛樹的起源

然後我做了一個git fsck --no-reflogs,發現左側有一個額外的懸掛提交。迭代git ls-tree按照我的方式,額外的提交給了我一堆樹木和Blob,除了左側的其中一個額外文件之外,它們都佔了一大堆。

在最後一個文件上使用git cat-file -t <sha1>告訴我這是一棵樹。但是,我在每次提交時都使用了git ls-tree,但仍然沒有找到此神祕樹對象的引用。那麼這個文件究竟是從哪裏來的?我99.99%肯定沒關係,只是好奇而已:P

+0

我實際上發現很多git repo都遵循相同的模式:左側的額外對象,右側的空/ info和/ pack文件夾。我確實改變了Git客戶端,我猜測這導致了所有這些差異。儘管如此,我還是很好奇這個特定的額外文件來自哪裏 – woojoo666 2015-02-23 12:52:15

+0

對兩個不同的回購站運行'diff'或類似的東西,即使它們在分支頭,遙控器,本地提交和工作目錄方面目前具有完全相同的狀態,由於至少是對象的打包/解包狀態,垃圾收集運行的頻率,reflog以及其他一些可能的原因,所以不會成爲可靠的比較方法... – twalberg 2015-02-23 16:35:06

+0

有趣,我想我會擁有閱讀這些主題。是的,我有一個懷疑,我在兔子洞裏走得太遠,但這是一個相對較小的回購(4-5次提交),所以我認爲這將是一個很好的機會,看看git的實際工作情況 – woojoo666 2015-02-23 21:29:14

回答

1

這個,菜鳥的錯誤。原來,額外的懸掛提交直接指向了缺失的樹。我認爲在一個提交對象上做git ls-tree <sha1>會給它指向的樹,但它實際上給了它所指向的樹的孩子。使用找到對象內容的git cat-file -p <sha1>,給了我所需的信息。

因此,似乎在.git/objects中的所有文件都是提交或懸掛提交。我發現this是一個關於git對象如何工作的簡明指南。