我已经在现有项目中初始化了git repo,暂存了所有文件,然后没有做出初始提交决定清理索引。不知道为什么我认为这是一个好主意,但我立刻输入了git reset --hard
(我现在无法说出我的想法,也许是几个不眠之夜造成的损失)。现在所有文件都消失了......
是否有可能至少恢复其中的一部分?我看到在.git/objects/
中注册了对象。
答案 0 :(得分:2)
如果您在git add
之前执行了git reset
暂存文件,那么所有文件和描述目录层次结构的树对象都在对象数据库.git/objects
中,除非垃圾收集已经足够长,或者你自己运行git gc
之类的东西。然而,重构事物需要花费一些工作 - git
没有预先打包内置的这个功能。这里有一些提示:
git cat-file -t HASH
以标识每个对象的类型。寻找那些树对象。请注意,对象哈希值将被拆分以命名.git/objects
中的文件。因此,具有散列“db6689df4f8aae84d35df2e496158b2746bb0f1e”的对象实际存储在.git/objects/db/6689df4f8aae84d35df2e496158b2746bb0f1e
,前两个字符用作子目录 - 您可以轻松地重建对象哈希值。如果您在.git/objects/pack
中有文件,则可能需要另外运行git verify-pack -v .git/objects/pack/pack-HASH.pack
以获取每个包文件中包含的对象列表。git cat-file -p HASH
查找文件的原始文件名和哈希值(也称为“blob”)。其中一棵树将匹配工作目录的根目录。一旦确定了根树对象,就可以git ls-tree -r HASH
以获取所有文件名及其各自哈希值的完整列表。git show HASH > FILENAME
来重新创建文件 - 您需要手动创建子目录,但首先。有了这些信息,编写一个可以为您完成繁重工作的脚本应该不会太困难。祝你好运!
编辑:或者,一旦您确定了根树对象,您就可以简单地echo "commit for recovery" | git commit-tree HASH
,它将创建一个提交并向您报告该新提交的哈希值。然后,您可以git checkout HASH
将文件恢复到工作目录中,并git branch BRANCHNAME
创建指向该提交的分支。如果您的git tar-tree
版本足够长,或git
,您也可以查看git archive
。