Git:无法读取对象...参数无效

时间:2012-08-10 18:58:30

标签: git recovery

强制VM关闭后我收到了这条git消息,这显然损坏了git索引

Git: Failed to read object abcdef.... Invalid argument

我查看了这些现有答案

Restore a corrupted index
Recover damaged git by HD failure

似乎没有用。

3 个答案:

答案 0 :(得分:1)

使用@ Arindam上面的答案对我来说不起作用,但是它的一个变体确实如此,我希望其他人觉得它很有用:

此时你正处于GIT的困境中。您无法使用当前分支的状态签出新分支,可能是因为reflog已损坏。

继续之前:

  • 将项目文件备份到其他地方
  • 在GIT表示无法找到对象之前,紧接着.git / logs / HEAD中最后一个成功的SHA1(根据@Arindam上面的内容)

在我的场景中,我大致知道什么时候我已经“丢失”的文件被修改了 - 大约4个小时前 - 所以运行以下内容会获取我在上次成功提交和现在之间编辑的所有项目文件:

$> cd my/project/dir
$> find . -type f -mmin -240 -exec grep -l "$1" {} \; | xargs ls -l
  • 记下find命令的输出到某个地方的文本文件中,因为你将在某个地方支持它们,你需要知道它们来自哪个目录,以便知道将它们“复制”到哪里。

手动将这些文件复制到其他地方(例如进入/ tmp / backup)或者通过扩展命令手动执行(我有大约十几个,所以手工不是一件苦差事)

  • 编辑.git / HEAD并将其内容替换为您在上面记下的SHA
  • 编辑.git / ORIG_HEAD并执行相同的操作

    $> git branch

GIT应该告诉你“(没有分支)”

$> git log

GIT应该为您提供上面提到的SHA1的日志消息

现在创建一个新分支:

$> git checkout -b my_new_branch

现在将/ tmp / backup中的所有文件复制到正确的位置并运行:

$> git commit -a -m "Some commit"

你已经完成了。你现在应该在一个名为“my_new_branch”的新分支中,在最后一次最成功的提交和现在之间修改所有文件 承诺和安全。

现在把这个批次重新开始,然后把它放回某处!

答案 1 :(得分:0)

让我们进入它并尝试解决它。仅当git reflog也不起作用时才使用此方法,因为显然您的索引已损坏,并且reflog无法从损坏的索引中读取。

打开.git/文件夹

查看名为HEAD的文件。
这有你的git目前所在分支的名称。

现在查找名为ORIG_HEAD的文件。
这个probably具有git能够注册的最后一次提交的SHA。如果是的话,Voila!

复制它(比如说X),在终端执行:
git show X > interim.patch

这会将您上次成功的更改复制到标准差异中。

同样将此SHA(X)复制到HEAD文件的内容。
这告诉git将此更改视为当前位置,它可以使用,因为它已经在一段时间后注册了它。

到目前为止,如果您执行git branch,则会转移到(no branch)

所以现在你有了改变。做git checkout -f <branch-name>
这将使用远程内容覆盖您的更改,但您仍然可以在该修补程序中使用它们。

所以到现在为止,你是

  • 到git分支
  • git已恢复

执行git apply interim.patch如果顺利进行,则表示您已进行更改。
然后继续正常的git步骤。

  • git add .
  • git commit -am 'Message'

你恢复了平静的生活。

答案 2 :(得分:-1)

将项目克隆到另一个目录中。调查你是否拥有原始版本中的所有参考文献。