修复缺失的树

4

我的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命令了,但我还没有找到解决方案。

+1 为意识到转移到适当的 shell 而欢呼 - Alojz Janez
你用了什么命令来“...检查d564d0bc是什么”? - EoghanM
@EoghanM 对不起,check-in 搞混了。我查了一下是什么东西。虽然很久了,但我认为可能只是一个 git checkout d564d0bc - MikeKusold
1个回答

3
如果您确定缺失的树仅包含.gitkeep文件并且您有它的内容,那么可以重新创建缺失的树。
您需要知道一堆低级Git命令?准备好了吗?开始吧!首先,您需要使用git mktree。
该命令从标准输入读取数据并基于此信息创建树。它输出新创建树的SHA1散列值(不要忘记检查它是否等于d564d0bc3dd917926892c55e3706cc116d5b165e)。
接下来,您需要知道这个输入的格式是什么?格式如下。
<mode> SP <type> SP <object> TAB <file>

其中,SP代表空格,TAB代表制表符。

  • 代表文件模式
  • 代表git对象类型(blob表示文件,tree表示文件夹)
  • 是对象的sha1哈希值
  • 是文件名

让我来举一个例子。 要从这个文件夹创建tree(some_file文件为空)

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命令来解决问题。
git hash-object log/.gitkeep

为了确定其哈希值。我认为你需要知道的所有内容都可以用来修复你的仓库。


非常感谢。对于其他可能遇到此问题的人,您需要进入文件夹,而不能仅使用路径。在我的例子中,我必须进入我的“日志”文件夹。我使用的最终命令是: echo -e "100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391\t.gitkeep" | git mktree - MikeKusold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接