我可以在git中签出树对象吗?

Pen*_*enz 3 git

我在损坏的存储库中丢失了提交对象,但是仍然有一些文件和树对象:

$ 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
Run Code Online (Sandbox Code Playgroud)

有没有办法检查出那个树对象?

我猜可能有一种方法可以用伪提交字符串重建提交对象并检查出来。

git cat-file -p tree-sha1
Run Code Online (Sandbox Code Playgroud)

seh*_*ehe 5

尝试

git read-tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
Run Code Online (Sandbox Code Playgroud)

或者更干净一些

git read-tree --prefix=rescue --index-output=/tmp/rescue.index b825dc642cb6eb9a060e54bf8d69288fbee4904
Run Code Online (Sandbox Code Playgroud)

将其放入子文件夹中(救援)。

请务必检查树所指的内容,它可能不是存储库根路径:


hob*_*bbs 5

如果您git checkout 4b825dc642cb6eb9a060e54bf8d69288fbee4904 .(路径名的点很重要,否则git会将其解释为分支切换操作并拒绝),它将更新工作目录索引中的所有文件以匹配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"
Run Code Online (Sandbox Code Playgroud)

给它一个提交和一个分支来解决它。