我不知道我对我的git repo做了什么,有人可以解释出了什么问题吗?
我的第一个命令是:width
git commit -m "another commit" .
失败了。然后我尝试git push -u origin master
并根据另一个没有解决我的问题的SO帖子删除文件。在这一点上我甚至不确定谷歌的任何建议?
git fsck --full
答案 0 :(得分:0)
通常,修复损坏的存储库并不容易,但在这种情况下,您缺少一个blob:
missing blob 7884ba2578c7535a2e3b70d410f0286bd2e0016f
您可以尝试从另一个存储库(例如从远程存储库)复制对象'.git / objects / 78 / 84ba ...'并将其粘贴到您的本地存储库中。
如果不是这种情况,您可以转到新的存储库并重新访问之前的提交:
git checkout previous_commit_hash .
然后将当前的工作空间文件复制到它并再次提交。
答案 1 :(得分:0)
您使用第二个命令从存储库中使用SHA-1名称7884ba2578c7535a2e3b70d410f0286bd2e0016f
编写了一个对象。
其余命令只是从互联网执行随机垃圾。
请接受我的建议:一旦你遇到一个所谓的严重问题 - 就像你所展示的第一个命令所指示的那样 - 只需通过物理复制来备份整个存储库 其整个目录位于其他地方 - 最好是在其他一些物理存储上(因为存储库下的H / W存储可能会失败)。 做完之后,冷静下来并寻求帮助。请不要尝试随机废话,就像建议一样使reflog过期(完全废话)。
好的,回到案例。 由于您已经确定了该对象,因此在恢复之前您不太可能继续进行。值得重复的是:Git将其所有对象存储在一个数据库中(位于" .git"目录下),并且该数据库由所有"事物"这是指保存在那里的历史。因此,无论哪个Git命令都无法找到对象,您可以确定它不在数据库中,您必须从其他地方获取它。
现在有两种可能性:
该对象是过去历史的一部分。
如果是,那么您有可能从其他地方托管的存储库副本中恢复它。
这是近期历史上未被推到任何地方的一部分。
如果是的话,您几乎不知所措,因为您只是用第二个命令物理删除了对象数据库的一部分。
因此。首先要尝试从其他地方克隆此存储库的副本,然后尝试运行
$ git cat-file -t 7884ba2578c7535a2e3b70d410f0286bd2e0016f
如果它打印出该对象的类型,一切都很好,您可以通过运行
继续恢复它$ git cat-file <type> 7884ba2578c7535a2e3b70d410f0286bd2e0016f > foo
其中<type>
是在上一步获得的对象类型(其中有三个:blob
,tree
和commit
)。最后两个单词使用shell重定向将输出内容放入名为&#34; foo&#34;的文件中。
之后,抓住该文件&#34; foo&#34;,将其复制到源存储库并运行
$ git hash-object -w foo
:此命令将从文件中提取内容并将其放入存储库中 - 从而导致对象存储中具有给定SHA-1哈希的对象。
您现在可以重新运行git fsck --full
。
尽管如此,即使这样做(它应该),我仍然对你已经删除所谓的&#34;包文件感到不安#34;包文件通常包含大量过去的历史记录,所以你应该删除很多东西。
为了解决这个问题,我尝试克隆一个可用的副本,然后从源存储库中获取未经提交的提交,然后我将开始使用此克隆到位原始存储库。