git - 如何诊断损坏的 git 存储库
问题描述
我的存储库损坏问题反复出现。事实上一天几次。当我在我拥有的 jupyter 笔记本中杀死内核时,这似乎发生了。我怀疑这里有问题的另一件事是LFS,它是 git 大文件的扩展。
在损坏状态下,大多数 git 命令(例如add
和status
停止在 repo 内工作)。当命令被执行时,终端就会停止。发生的另一件事是,一旦我cd
进入 repo,zsh(使用 git 扩展)也会中断。外壳停止并且无法恢复。
我想知道一种在回购处于这种状态时诊断回购的方法,以找出这种反复中断的原因是什么。
我并不完全需要帮助来恢复 repo,因为我有一个备份并且可以轻松地再次设置它。但是每天这样做4次有点烦人......
解决方案
我怀疑你做同样的事情:涉及 Git-LFS。
使用 Git-LFS 时,存储库中的许多操作,包括添加文件git add
,必须在过滤器的帮助下进行, Git 将过滤器称为smuge和clean过滤器。运行git status
并不总是需要任何过滤器,因此这是一个线索,表明可能涉及其他东西(相反或同样),但过滤器显然是出错的地方。你的 shell 可能有一些 shell 魔法来处理$PS1
Git 存储库中的提示符 (),因此它正在运行挂起的 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
推荐阅读
- c# - C#使用ServiceController类获取服务登录?
- google-apps-script - Google Apps 表格 if 语句未执行
- python - 在 keras 中进行迁移学习时 fit 和 fit_generator 之间的区别
- batch-file - 将 sqlcmd 输出文件发送到作为变量的目录
- css - 更改动画背景的渐变颜色
- eclipse - 从 Eclipse 外部工具中运行 QEMU
- oracle - Microsoft 事务服务器的 Oracle 服务失败
- json - 将输出过滤为json中所需的值
- vb.net - WebBrowser 中的 VB.NET SetAttribute 不起作用
- php - 如何从 $registration 中获取注册信息?(雄辩)