2012-07-24 52 views
3

我的git repo已经损坏,不幸的是它只存在于本地。修复丢失的树

$ 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文件。

我试过按照post中提到的步骤,但我使用GitHub for Windows,PowerShell通过一个空管道尖叫着我。

任何帮助表示赞赏。

更新:我将项目复制到Linux,所以我不必担心PowerShell命令。尽管如此,我仍然没有找到解决方案。

+0

+1用于实现移动到合适的外壳 – 2013-10-24 11:49:28

+0

您使用了什么命令来检查d564d0bc是什么? – EoghanM 2014-03-22 15:04:22

+0

@EoghanM对不起,签入很混乱。我看着它是什么。这已经很长时间了,但我认为它可能只是一个'git checkout d564d0bc' – MikeKusold 2014-03-22 16:35:21

回答

2

如果您确定缺少的树只包含.gitkeep文件,并且您的内容超出了重新创建缺少树的可能性。

所有你需要知道的是一堆低级别的git命令?你准备好了吗?走!首先是 。您需要使用git mktree

该命令从标准输入数据中读取数据并根据此信息创建一棵树。它输出新创建的树的SHA1 SUMM(不要忘记检查它等于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 

确定其散列。我认为所有你需要知道修复你的仓库。

+0

非常感谢。对于任何可能有此问题的人,您需要将cd放入该文件夹中,不能只使用路径。在我的例子中,我不得不进入我的'log'文件夹。我使用的最终命令是: 'echo -e“100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 \ t.gitkeep”| git mktree' – MikeKusold 2012-07-25 14:03:33