如何在 Github for Windows 崩溃后恢复 repo?
Posted
技术标签:
【中文标题】如何在 Github for Windows 崩溃后恢复 repo?【英文标题】:How do I recover a repo after a Github for Windows crash? 【发布时间】:2012-10-11 15:49:59 【问题描述】:当我尝试提交时,Github for Windows 刚刚被炸毁,现在 git(命令行)告诉我每个文件都是新的。我还有一个 .get 文件夹,大小为 53mb。在此之前,我进行了大约 60 到 100 次提交。
如何在不丢失任何历史记录或更改的情况下恢复我的工作副本?
Git 状态说:
在主分支上
初始提交
要提交的更改: (使用“git rm --cached ...”取消暂存)
新文件:.gitattributes 新文件:.gitignore ...(还有 1620 个文件)
未为提交暂存的更改: (使用“git add ...”更新将提交的内容) (使用 "git checkout -- ..." 丢弃工作目录中的更改)
修改:Src/Foo/Bar/Index.cshtml
未跟踪的文件: (使用“git add ...”来包含将要提交的内容)
Posh Git 命令提示符如下所示
C:\Projects\Foo [master +1623 ~0 -0 | +0 ~1 -0]>
git log
的输出如下
C:\Projects\Foo [master +1623 ~0 -0 | +1 ~1 -0 !]> 混帐日志 致命:错误的默认修订版“HEAD”
更新
我刚刚从 Git GUI 运行“验证数据库”,它返回以下内容:
悬空树 4b825dc642cb6eb9a060e54bf8d69288fbee4904 悬空提交 30855e0deee8600f10733e6760db54fee2570a38 悬空提交 cd8bc69ad56ca5c4d51d0d5028525698158cf3ec 悬空提交 c934f9823d907cd69c5e08a0159b9de4dfe3da35 悬空提交 f958caca247978db978b70460276b5da7582bb06 注意:HEAD 指向一个 未出生的分支(主)通知:没有默认引用
【问题讨论】:
如果没有更具体的诊断,真的很难说出这里问的是什么。您可能应该包括一些 git status 的输出以及您所期望的/之前的内容。同时我会投票结束。 【参考方案1】:首先:不要惊慌。备份您的项目,包括您的工作文件夹。嗯...实际上,制作 两个 :)
我还有一个 .git 文件夹,大小为 53mb。
Git 是一个非常有弹性的工具。对对象数据库的分析可以“重建”您的历史。
此外,GHfW 记录了与 repo 的大部分交互。长话短说,GHfW 团队很有可能会帮助您挽救您的回购协议。
如 announcement blog post
所述我们确保阅读 Twitter 上的每一个提及。如果您发现错误,请将其提交至 support@github.com。每封电子邮件都由真人阅读。
给他们发邮件。喜欢现在。
【讨论】:
我将如何按照您的建议进行“分析对象数据库”? 这本身就是一个问题……而且是一个相当复杂的问题;)有不同种类的对象(提交、树、Blob 和标签)。每个对象都存储在 .git/objects 结构中(以打包或松散格式)。树列出了它的“孩子”(Blob、其他树或提交(子模块))。提交指向树及其父提交的列表。带注释的标签可以指向其他三个对象中的任何一个。考虑到这一点,应该能够重建对象之间的关系。 .git/refs 的内容最终将帮助您识别“书签”对象(头部和标签)。【参考方案2】:好的,首先,我复制了我的工作副本,所以我总是有一个后备位置。接下来我运行git fsck
,它给出了以下输出。
> dangling tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 dangling commit
> 30855e0deee8600f10733e6760db54fee2570a38 dangling commit
> cd8bc69ad56ca5c4d51d0d5028525698158cf3ec dangling commit
> c934f9823d907cd69c5e08a0159b9de4dfe3da35 dangling commit
> f958caca247978db978b70460276b5da7582bb06 notice: HEAD points to an
> unborn branch (master) notice: No default references
从这里开始,我使用了
git checkout <some-hash>
处理上面悬空提交的哈希值。事实证明,最后一个悬空提交是我最近的提交,所以 git checkout c934f9823d907cd69c5e08a0159b9de4dfe3da35
让我回到崩溃前的工作副本。
从这里我做了git checkout -b master
,它在这次提交中重新创建了我的主分支。 git status
现在显示了一项更改,这是我尝试进行的提交。承诺让我重回正轨。
【讨论】:
@NoufalIbrahim 不,但一开始很吓人以上是关于如何在 Github for Windows 崩溃后恢复 repo?的主要内容,如果未能解决你的问题,请参考以下文章
如何从自定义 shell 使用 GitHub for Windows 附带的 posh-git?
github 和 github for windows 学习使用总结