强制VM关闭后我收到了这条git消息,这显然损坏了git索引
Git: Failed to read object abcdef.... Invalid argument
我查看了这些现有答案
Restore a corrupted index
Recover damaged git by HD failure
似乎没有用。
答案 0 :(得分:1)
使用@ Arindam上面的答案对我来说不起作用,但是它的一个变体确实如此,我希望其他人觉得它很有用:
此时你正处于GIT的困境中。您无法使用当前分支的状态签出新分支,可能是因为reflog已损坏。
继续之前:
在我的场景中,我大致知道什么时候我已经“丢失”的文件被修改了 - 大约4个小时前 - 所以运行以下内容会获取我在上次成功提交和现在之间编辑的所有项目文件:
$> cd my/project/dir
$> find . -type f -mmin -240 -exec grep -l "$1" {} \; | xargs ls -l
手动将这些文件复制到其他地方(例如进入/ tmp / backup)或者通过扩展命令手动执行(我有大约十几个,所以手工不是一件苦差事)
编辑.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 apply interim.patch
如果顺利进行,则表示您已进行更改。
然后继续正常的git步骤。
git add .
git commit -am 'Message'
你恢复了平静的生活。
答案 2 :(得分:-1)
将项目克隆到另一个目录中。调查你是否拥有原始版本中的所有参考文献。