如何在本地恢复`.git/index`?

42

我意外地删除了 .git/index,有没有办法恢复它?它已经被永久删除了。我还没有提交过任何东西。


2
所以这是一个干净的代码库 - 只需删除整个目录并创建一个新的仓库? - Daniel A. White
你已经将任何内容添加到索引中了吗?您是否想要恢复的特定文件版本已经被暂存,但与现在工作树上的副本不同? - CB Bailey
1
如果你在尝试“rm .git/index.lock”后来到这里,请点赞 :v - Mateo Tibaquira
3个回答

63

要重新构建索引文件,您可以尝试这两个命令:

git reset         # re-scan the working directory
git add -u        # update the index

6
您可以使用 git reset 命令将索引恢复到最后一次检出时的状态。自那时以来添加的任何内容都已添加到存储库中,但是索引是记录路径和内容关联的唯一位置。您可以使用 git fsck 将不可访问的对象丢弃到一个 lost'n'found 目录中,详情请参见 它的文档,然后最快的方法就是将内容放回工作树并再次添加,git 不会重复内容,但会恢复索引条目。

5
我不认为这是可能的,至少不是通过 git (你可以尝试查看垃圾箱目录或任何文件系统提供的恢复手段)。但只要你添加了某些内容或进行了其他需要索引的操作,就会得到一个新的索引。
如果你丢失了任何已添加到 git 的文件,你可以浏览 ./git/objects 目录(find .git/objects/ -type f |sed 's:\.git/objects/::; s:/::'),使用 git cat-file -p $the_hash 检查每个文件的内容,一旦找到丢失的文件,将输出重定向到一个文件中。
(当你执行 git add 时,文件名条目会被添加到 .git/index 文件中,并且文件内容会被存储在 .git/objects/ 目录中。Git 索引由树对象的文件名条目组成,在你执行 commit 时创建。你可以使用 git ls-files --stage 命令查看索引的人类可读表示形式)。

2
索引里面有更多的东西,但基本上它是一个名称和哈希缓存。为了完整起见,值得一提的是,索引每个名称有四个可能的“插槽”:插槽1-3仅在冲突合并期间使用,而插槽零则是正常的下一个提交入口。 - torek
2
这节省了我不少时间。我已经暂存了一些文件,然后意识到仓库正在进行 cherry-pick 操作,执行 git cherry-pick --abort 命令会清空索引!我使用了您的 find | sed 命令来恢复索引。谢谢! - legends2k

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