修复损坏的Git存储库

Unk*_*own 42 git corruption

由于电源问题,我的Git存储库在经过几次硬重启后损坏了,现在我无法修复它(我在最后一次电源故障时暂停了一些文件):

$ git status
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument
$ git fsck
fatal: failed to read object 24377c609184c192f3f3c1733bac7115c1080758: Invalid argument
$ git branch -a
(...works, lists branches...)
$ git checkout someotherbranch
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument
$ git log
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument
$ git log someotherbranch
(...works, shows commits...)
Run Code Online (Sandbox Code Playgroud)

所以,正如你所看到的,我当前的分支已经搞砸了,我似乎无法修复它.我可以尝试修复此问题?

Nas*_*ges 36

我对类似情况的解决方案是.git/refs/heads/my-working-branch使用先前提交的哈希值(可以在其中找到.git/logs/HEAD)替换损坏对象的哈希值.

  • 我不确定我明白这是什么 (6认同)
  • 哇。这行得通...我的`HEAD`已损坏为`^ @ ^ @ ^ @ ^ @ ...或类似的东西。 (3认同)
  • 你救了我 !!!我当时在做一个新项目,没什么要掌握的。GitHub Mac客户端被搞砸了。不知何故删除了我所有的src文件,而我只剩下一个node_modules。万分感谢 !!! (2认同)
  • @纳什·布里奇斯,你是我的英雄!对于需要更具体示例的任何人:当您打开 `.git/refs/heads/my-working-branch` 时,转到最底部,您应该看到 `0f50.. 017f.. [name] [date] [commitmsg ]` 其中 [commitmsg] 是灾难发生前的最后一次提交。假设您正在名为 feature/myfeature 的分支中工作,请将“0f50..”哈希值(第一个)粘贴到“.git/refs/heads/feature/myfeature”中。问题解决了。麾。 (2认同)

nbu*_*ell 17

这恰好发生在我身上.我将存储库重新放入新文件夹中,并手动移动我的最新更改.技术含量低,但每次都有效.希望你能记住你最后的改变.

  • 您可以简单地将损坏的仓库中的`.git`文件夹替换为您重新克隆的文件夹.这样您就不需要手动移动更改.请注意分支.您可能必须藏匿并检查正确的分支. (8认同)

San*_*ika 12

对我来说最简单的解决方案:您应该git clone在一个新文件夹中,然后将干净的new_folder/.git替换为旧文件夹(损坏的文件夹)。它对我来说效果很好!

git clone ...(remote) new_folder
mv old_folder/.git  old_folder/.git_old
cp -R new_folder/.git  old_folder/
Run Code Online (Sandbox Code Playgroud)


ste*_*eve 9

对我来说,我已经在OS X中使用非Apple SSD(不推荐使用)启用了TRIM,并且显然在我的启动盘上造成了各种损坏.因此,腐败的提交在历史上是深刻的.

我不太关心修复我的存储库,除了我有一些本地分支太过实验性而无法推动到远程存储库,我想在这些分支中挽救工作.

从理论上讲,由于这是一个本地存储库,我觉得Git应该能够使用origin恢复/修复自己.为什么这不可能?

无论如何,我偶然发现了这个很酷的策略,将分支推送到另一个本地Git存储库.不幸的是,将存储库克隆到../repo_copy然后将其用作本地远程导致以下错误:

! git push --force local_remote HEAD
fatal: failed to read object e0a9dffddeeca96dbaa275636f8e8f5d4866e0ed: Invalid argument
error: failed to push some refs to '/Users/steve/Dev/repo_copy'
Run Code Online (Sandbox Code Playgroud)

所以我开始使用一个空的存储库,然后将分支推送到它工作正常.因此对于我git log没有结束的任何本地分支:

....
    Fixing cukes
fatal: failed to read object e0a9dffddeeca96dbaa275636f8e8f5d4866e0ed: Invalid argument
Run Code Online (Sandbox Code Playgroud)

我只是检查出来,然后做git push --force local_remote HEAD.我做的最后一件事是:

! cd ~/Dev/repo_copy
! git remote add origin git@github.com:sdhull/my_repo.git  # real remote
Run Code Online (Sandbox Code Playgroud)

然后我进入git config -e并建立了我的主分支,并且在没有丢失的情况下恢复运行!


Mic*_*ior 8

尝试备份存储库,然后运行git reset --hard HEAD@{1}以返回到上一个HEAD,看看是否有效.它可能只是HEAD被破坏的电流.

(fsck如果还没有,也应该在磁盘上运行.)


gab*_*ous 6

另一种对我有用的替代方法是使用以下方法将 Git 头和索引重置为以前的状态:

git reset --keep
Run Code Online (Sandbox Code Playgroud)

我也尝试了以下命令,但它们对我不起作用,但可能对你有用:

git reset --mixed
git fsck --full
git gc --auto
git prune --expire now
git reflog --all
Run Code Online (Sandbox Code Playgroud)


stu*_*ent 5

我遇到了同样的问题,并使用git-repair执行了以下步骤

  • cp myrepo myrepo.bak
  • cd myrepo
  • git repair --force(首先尝试不使用force

成功后,树被设置回上次工作提交。

然后我将meld myrepo myrepo.bak更改从损坏的存储库的工作树应用到修复的存储库。

  • 您能指定您使用的是哪个版本吗?它在 1.8.3.1 中不可用 (2认同)
  • 我收到此错误---> git: 'repair' 不是 git 命令。请参阅“git --help”。 (2认同)