今日分享 – 记一次私有 git 仓库恢复事件

warning: 这篇文章距离上次修改已过202天,其中的内容可能已经有所变动。

今日一个私有 git 仓库突然无法访问,查阅日志得知错误为:error: object file .git/objects/* is empty ...

溯源

首先对运行在 Longhorn 上仓库磁盘做个快照。继续检查上游日志,发现15分钟前 DroneCI 提交编译结果时,仓库磁盘由于性能问题,正好发生了迁移事件。事件溯源到此,先解决仓库访问问题,再来查看磁盘问题吧。

解决思路

1、由于是文件写入失败导致的问题,故而只要删除仓库里的空文件即可,进入仓库目录后执行下面的命令。

# 查看有问题的存储对象
git fsck --full
# 删除仓库下的所有空文件
find . -type f -empty -delete -print

2、由于删除了最后提交的文件,分支标记将会失效,我们先来查找孤立的提交,再关联到分支。

# 命令结束后拿到 `angling commit` 的值 xxxxxx
git fsck --full
# 关联到当前分支
git update-ref HEAD xxxxxx

3、如果有多个分支,可以查阅本地的 commit hash 与分支的对应关系,然后关联到指定分支。

# 分别对 `angling commit` 进行关联
git update-ref refs/heads/branch-1 xxxxxx
git update-ref refs/heads/branch-2 yyyyyy

结束语

至此,仓库已经恢复。此次事件,让我对分布式文件系统的可靠性产生了一丝丝的动摇。但无论如何,对生产数据进行妥善备份才是最重要的。

正文完