我在损坏的存储库中丢失了提交对象,但仍然有一些文件和树对象:
$ git fsck
Checking object directories: 100% (256/256), done.
dangling blob 031be26142ed97da216fb7d79d16a0b0efdf0d71
dangling blob 4b2be7dfef082c2e247be52e6d78600af7b6dd40
dangling tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
dangling blob ccbb1056cb4e744f9a4b44a439fa036f6a3d7cbe
dangling blob 10bfbc3c1fa10e08cd6a783565f00e7324f61fe5
dangling blob 9b529957be714fef304c4e8161fe6cd138510e98
dangling blob dd5b54882d0b74db99c8a7fbba703d528dc559b9
有没有办法检查那个树对象?
我想可能有办法用虚拟提交字符串重建提交对象并检查出来。
git cat-file -p tree-sha1
答案 0 :(得分:4)
如果您git checkout 4b825dc642cb6eb9a060e54bf8d69288fbee4904 .
(路径名的点很重要,否则git会将其解释为分支切换操作并拒绝)它将更新工作目录和<中的所有文件/ em>匹配4b825d状态的索引...(即git diff
不会显示任何内容,git diff --staged
会显示很多更改,而git status
会显示很多内容M)。您可以通过这种方式检查文件的状态。
如果您猜测相关的父提交,可以
git checkout -b recover relevant_parent
git checkout 4b825dc642cb6eb9a060e54bf8d69288fbee4904 .
git commit -m "Recovered this thing that git fsck told me about"
给它一个提交和一个分支来解决它。
答案 1 :(得分:3)
如果经常发生这种情况,或者您需要在其他提交中来回切换,则可以创建一个指向此树的新提交对象,然后创建一个指向它的新分支以方便:
git commit-tree <<treeid>>
<<type a commit message>>
^D
<<this will produce a hash for the new commit object>>
git branch newbranch <<newcommithash>>
然后,只要你需要...... {/ p>,你就可以git checkout newbranch
答案 2 :(得分:2)
尝试
git read-tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
或更清洁
git read-tree --prefix=rescue --index-output=/tmp/rescue.index b825dc642cb6eb9a060e54bf8d69288fbee4904
将它放入子文件夹(救援)。
请务必检查树引用的内容,它可能不是存储库根路径: