4

我的 git repo 已损坏,不幸的是它只存在于本地。

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

我检查了它是什么d564d0bc,它是我log/在 rails 项目中的文件夹。此文件夹仅包含*.log文件(被忽略)和一个.gitkeep文件。

我尝试按照本文中提到的步骤进行操作,但我使用的是 Windows 版 GitHub,而 powershell 在一个空管道上对我大喊大叫。

任何帮助表示赞赏。

更新:我将项目复制到 linux 中,所以我不必担心 powershell 命令。我仍然没有找到解决方案。

4

1 回答 1

3

如果您确定丢失的树仅包含 .gitkeep 文件并且您拥有其内容,则可以重新创建丢失的树。

你只需要知道一堆低级的 git 命令吗?你准备好了吗?去!首先。你需要使用git mktree.

此命令从标准输入数据中读取并根据此信息创建一个树。它输出新创建的树的 sha1 总和(不要忘记检查它是否等于 d564d0bc3dd917926892c55e3706cc116d5b165e)

接下来你需要知道这个输入的格式是什么?!格式如下

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

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

  • 是文件模式
  • 是一个 git 对象类型(文件的 blob,文件夹的树)
  • 是对象的 sha1 哈希
  • 是一个文件名

让我举个例子。从该文件夹创建树(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

来确定它的哈希值。我认为您需要知道的所有内容来修复您的存储库。

于 2012-07-25T00:13:07.657 回答