首页 > 解决方案 > 如何诊断损坏的 git 存储库

问题描述

我的存储库损坏问题反复出现。事实上一天几次。当我在我拥有的 jupyter 笔记本中杀死内核时,这似乎发生了。我怀疑这里有问题的另一件事是LFS,它是 git 大文件的扩展。

在损坏状态下,大多数 git 命令(例如addstatus停止在 repo 内工作)。当命令被执行时,终端就会停止。发生的另一件事是,一旦我cd进入 repo,zsh(使用 git 扩展)也会中断。外壳停止并且无法恢复。

我想知道一种在回购处于这种状态时诊断回购的方法,以找出这种反复中断的原因是什么。

我并不完全需要帮助来恢复 repo,因为我有一个备份并且可以轻松地再次设置它。但是每天这样做4次有点烦人......

标签: gitgithubrepositorydiagnostics

解决方案


我怀疑你做同样的事情:涉及 Git-LFS。

使用 Git-LFS 时,存储库中的许多操作,包括添加文件git add,必须在过滤器的帮助下进行 Git 将过滤器称为smugeclean过滤器。运行git status并不总是需要任何过滤器,因此这是一个线索,表明可能涉及其他东西(相反或同样),但过滤器显然是出错的地方。你的 shell 可能有一些 shell 魔法来处理$PS1Git 存储库中的提示符 (),因此它正在运行挂起的 Git 命令,等待过滤器完成。

如果是这种情况,禁用过滤器将证明它会重新开始工作。要禁用过滤器,请小心地将任何.gitattributes和/或.git/info/attributes文件移开。1 然后cd进入回购,看看事情是否正常。如果是这样,它不仅仅是 Git-LFS,特别是过滤器。

LFS 过滤器通过检查和更改每个 as-stored-in-Git 文件的内容来工作 - 即存储库数据库中的blob对象,通过提交及其树存储并在 Git 的索引文件中列出 - 与文件的内容存储在工作树中。留下一个小文件。然而,对于一个文件,LFS 告诉 Git:不要注意那个文件!让我给你一个 URL(也许还有一些辅助数据)! LFS 通过网络将文件从大文件存储附件复制到或复制到任何地方,而 Git 只看到/存储 URL。

如果过滤器进程本身挂起,或者如果大文件存储附件无法访问,Git 将只是坐在那里等待,可能永远。如果您仍然可以使用存储库的另一个克隆,则必须是 LFS 附件是可访问的,因此必须是过滤器进程本身卡住了。

您可以查看系统上运行的所有进程并找到卡住的过滤器并终止它/它们。这可能会或可能不会使存储库再次工作,具体取决于它们被卡住的原因和方式。


1可能不止一个。我没有玩过 Git-LFS。我的理解是它只使用一个,但这可能是错误的。请注意,过滤器本身是在 中定义.git/config,但由于或中的条目而被使用.gitattributes$GIT_DIR/info/attributes


推荐阅读