git blob在推送时失败

时间:2016-08-12 17:33:21

标签: git commit

我不知道我对我的git repo做了什么,有人可以解释出了什么问题吗? 我的第一个命令是:width git commit -m "another commit" .失败了。然后我尝试git push -u origin master并根据另一个没有解决我的问题的SO帖子删除文件。在这一点上我甚至不确定谷歌的任何建议?

git fsck --full

2 个答案:

答案 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命令都无法找到对象,您可以确定它不在数据库中,您必须从其他地方获取它。

现在有两种可能性:

  1. 该对象是过去历史的一部分。

    如果是,那么您有可能从其他地方托管的存储库副本中恢复它。

  2. 这是近期历史上未被推到任何地方的一部分。

    如果是的话,您几乎不知所措,因为您只是用第二个命令物理删除了对象数据库的一部分。

  3. 因此。首先要尝试从其他地方克隆此存储库的副本,然后尝试运行

    $ git cat-file -t 7884ba2578c7535a2e3b70d410f0286bd2e0016f
    

    如果它打印出该对象的类型,一切都很好,您可以通过运行

    继续恢复它
    $ git cat-file <type> 7884ba2578c7535a2e3b70d410f0286bd2e0016f > foo
    

    其中<type>是在上一步获得的对象类型(其中有三个:blobtreecommit)。最后两个单词使用shell重定向将输出内容放入名为&#34; foo&#34;的文件中。

    之后,抓住该文件&#34; foo&#34;,将其复制到源存储库并运行

    $ git hash-object -w foo
    

    :此命令将从文件中提取内容并将其放入存储库中 - 从而导致对象存储中具有给定SHA-1哈希的对象。

    您现在可以重新运行git fsck --full

    尽管如此,即使这样做(它应该),我仍然对你已经删除所谓的&#34;包文件感到不安#34;包文件通常包含大量过去的历史记录,所以你应该删除很多东西。

    为了解决这个问题,我尝试克隆一个可用的副本,然后从源存储库中获取未经提交的提交,然后我将开始使用此克隆到位原始存储库。