我的Git回购已经腐化了,不幸的是它只存在于本地。

$ git fsck --full
Checking object directories: 100% (256/256), done.
broken link from    tree 54b4ff576b2e39831a298e58a38d91890f622b63
              to    tree d564d0bc3dd917926892c55e3706cc116d5b165e
missing tree d564d0bc3dd917926892c55e3706cc116d5b165e

我签入了d564d0bc是什么,它是我在rails项目中的log/文件夹。此文件夹仅包含*.log文件(被忽略)和.gitkeep文件。
我试着按照本文中提到的步骤操作,但我使用的是github for windows,powershell在一个空管道上向我尖叫。
如有任何帮助,我们将不胜感激。
更新:我将项目复制到linux中,这样就不必担心powershell命令了。不过,我还是没有找到解决办法。

最佳答案

如果您确定丢失的树只包含.gitkeep文件,并且您拥有它的内容,则无法重新创建丢失的树。
你只需要知道一堆低级的git命令?你准备好了吗?快走!
首先。您需要使用git mktree
此命令从stdin数据读取并基于此信息创建树。它输出新创建树的sha1总和(不要忘记检查它是否等于d564d0bc3dd917926892c55e3706cc116d5b165e)
接下来你需要知道这个输入的格式是什么?啊!
格式如下

<mode> SP <type> SP <object> TAB <file>

其中sp是一个空格,tab是一个tab。
是文件模式
是git对象类型(blob表示文件,tree表示文件夹)
是对象的sha1散列
是一个文件名
让我举个例子。
从该文件夹创建树(some_文件为空)
drwxrwxr-x 2 aleksandr aleksandr 4096 2012-07-25 03:51 .
drwxrwxr-x 4 aleksandr aleksandr 4096 2012-07-25 03:54 ..
-rw-rw-r-- 1 aleksandr aleksandr    0 2012-07-25 03:51 some_file

你得跑了
echo -e "100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391\tsome_file" | git mktree

但是你是怎么找到想要的sha1杂烩的?去救援。
只是
git hash-object log/.gitkeep

以确定其哈希值。我想你需要知道的就是修复你的仓库。

09-04 00:02