我已经在现有项目中初始化了 git repo,暂存了所有文件,然后在没有进行初始提交的情况下决定清理索引。不知道为什么我认为这是一个好主意,但我立即输入git reset --hard
(我真的不能说出我此刻的想法,也许几个不眠之夜造成了损失)。现在所有文件都消失了...
是否有可能至少恢复一部分?我看到有对象注册在.git/objects/
.
如果你做了一个git add
在之前暂存文件git reset
,那么所有文件和描述目录层次结构的树对象都在您的对象数据库中.git/objects
,除非垃圾收集已经启动了足够长的时间,或者您运行了类似的操作git gc
靠你自己。然而,重建事物需要一些工作——git
未预先打包内置此功能。以下是一些提示:
- Use
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”)。其中一棵树将与您的工作目录的根目录相匹配。一旦确定了根树对象,您就可以
- run
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
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)