Git 恢复:“目标文件为空”。如何重新创建树木?

2023-12-12

注意:我没有此存储库的任何损坏前克隆。我相信我的情况与这里描述的其他人不同,因为我缺少一棵树,而不是一个斑点。

发生了什么:

当我尝试通过 LAN(通过 SSH)克隆存储库时,Git 返回一条错误,指出存储库已损坏:

remote: error: object file ./objects/2e/223ce259e9e33998d434acc778bc64b393d5d4 is empty
remote: fatal: loose object 2e223ce259e9e33998d434acc778bc64b393d5d4 (stored in ./objects/2e/223ce259e9e33998d434acc778bc64b393d5d4) is corrupt
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.

我在某个地方发现了git fsck可用于诊断腐败,但它没有告诉我任何新信息:

git fsck --full
error: object file ./objects/2e/223ce259e9e33998d434acc778bc64b393d5d4 is empty
fatal: loose object 2e223ce259e9e33998d434acc778bc64b393d5d4 (stored in ./objects/2e/223ce259e9e33998d434acc778bc64b393d5d4) is corrupt

我尝试在本地克隆存储库(使用--no-hardlinks)看看会发生什么,但我得到了完全相同的结果。

然后我偶然发现这个问题,而回答的人刚刚删除了空文件(步骤 3),所以我这样做了(即我已经删除了文件223ce259e9e33998d434acc778bc64b393d5d4从子目录objects/2e/).

git fsck再次,我看到:

Checking object directories: 100% (256/256), done.
broken link from    tree 838e437f371c652fa4393d25473ce21cbf697d7a
              to    tree 2e223ce259e9e33998d434acc778bc64b393d5d4
dangling commit 54146bc0dc4eb3eede82a0405b749e05c11c5522
missing tree 2e223ce259e9e33998d434acc778bc64b393d5d4
dangling commit 864864feec207786b84158e526b2faec7799fd4e
dangling blob d3cfd7cc7718d5b76df70cf9865db01c25181bfb

所以,现在树有一个问题838e437f37。这不是上面提到的那个人发生的事情,所以我去谷歌搜索发现来自 Linus 的一些信息.

所以我做了git ls-tree 838e437f371c652fa4393d25473ce21cbf697d7a输出中有一行内容:

040000 tree 2e223ce259e9e33998d434acc778bc64b393d5d4    moje

现在,“moje”是一个目录(与 Linus 解释的示例不同,它是一个文件)。我想这就是 Linus 建议下一步的原因,git hash-object mojefatal: Unable to hash moje.

但无论如何,这就是我需要的可能性很小,所以我进一步寻找。我跑了git log --raw --all --full-history -- moje/根据 Linus 的指南,应该有一个提交将 2e223 列为某些内容的 SHA-2 哈希,但没有。列表结尾为

fatal: unable to read source tree (2e223ce259e9e33998d434acc778bc64b393d5d4)

我尝试查看该错误之前列出的最后一次提交,但没有找到此哈希。我见过this,但这对我没有帮助,可能是因为were有问题的版本和工作树的当前状态之间的一些变化。

有一件事情可能很重要:内部moje/有一个目录cli/它本身就是一个 Git 存储库(子模块)。我在那里寻找有问题的 SHA-2 哈希,但没有找到。

我应该怎么办?


命令(由 Chronial 建议)

git rev-list --all | xargs -l -I '{}' sh -c 'if git ls-tree -rt {} > /dev/null 2>&1 ; then true; else git log --oneline -1 {}; git ls-tree -r -t {} | tail -1; fi'

返回依赖于缺失的第一个提交2e223ce对象 - 它的 SHA-2 哈希值是499b8fb。它的父级没问题(我可以看到它的内容,检查它等),而且我还能够检查损坏的提交之后的下一个提交(89b0fc4).

现在我需要看看这两个“好的”提交之间发生了什么变化 - 这很简单:git diff 499b8fb~ 89b0fc4

diff --git a/somefile b/somefile
deleted file mode 100644
index f5d1e1e..0000000
--- a/somefile
+++ /dev/null
@@ -1,79 +0,0 @@
[ contents of the deleted "somefile"... ]
diff --git a/moje/cli b/moje/cli
index 640a825..c0b1a24 160000
--- a/moje/cli
+++ b/moje/cli
@@ -1 +1 @@
-Subproject commit 640a825cd671dfba83601d6271e7e027665eaca8
+Subproject commit c0b1a24aa246289831ec7db3a8596376db1f625a

现在我知道在错误提交和良好提交的父文件之间somefile被删除,子模块的 HEAD 更改为640a825 to c0b1a24。我去了子模块存储库并询问这两者之间发生了什么提交:

git log --oneline 640a825..c0b1a24

返回的

c0b1a24 <commit message>
8be9433 <commit message>
02564e1 <commit message>

现在我知道之间发生了四件事499b8fb~ and 89b0fc4:

  • somefile被删除
  • /moje/cliHEAD 已更改为640a825 to 02564e1
  • /moje/cliHEAD 已更改为02564e1 to 8be9433
  • /moje/cliHEAD 已更改为8be9433 to c0b1a24

我不知道哪一部分发生在499b8fb(错误的提交),并且在89b0fc4。但幸运的是,可能性并不多,所以我只是尝试了每一种。对于每个组合,我都会进行提交,以便 Git 计算适当的对象并将它们存储在数据库中。原来,当/moje/cliHEAD 位于8be9433, git commit导致创建了失踪的2e223ce对象 - 万岁!

注意:如果您遇到类似的情况,并且正在四处查看哪些提交是好的以及 Git 可以告诉您有关这些提交的哪些信息,请记住,能够checkout一次提交和show这是两件不同的事情。例如,我最初认为如果git show somesha抛出一个错误,这意味着somesha提交已损坏,我无法将其用于任何用途。事实证明这是错误的:虽然git show 89b0fc4返回了一个错误,我能够git checkout 89b0fc4并且git diff 499b8fb~ 89b0fc4 worked.

我想那是因为git show somesha显示了引入了哪些更改somesha,为此,Git 需要读取上一次提交的内容(在本例中是损坏的提交)。显然,Git 不需要查看前一次提交来检查一次。

(我成功地做到了这要归功于克罗尼尔的回答- 向他致敬!建议我将此作为我自己的答案发布。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git 恢复:“目标文件为空”。如何重新创建树木? 的相关文章

随机推荐

  • TensorFlow 索引无效(越界)

    您好 我目前正在尝试使用自己的图像数据运行 TensorFlow 但是当我尝试运行这些函数时它崩溃了 它来自 mnist py def loss fn logits labels batch size tf size labels labe
  • opengl:如何避免纹理缩放

    我该如何申请重复无论应用的顶点数据如何 纹理始终保持其原始比例 纹理中的 1 个像素 屏幕上的 1 个像素 我意识到这不是最常见的任务 但是是否可以轻松设置 opengl 来执行此操作 或者我是否需要对尊重其原始外观的顶点数据应用某种掩码
  • java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法以选择 sqlite

    我是安卓世界的新手 我的编码有问题 这只是一个小错误 我不知道它不起作用 即使我改变了其他方法 但错误仍然是相同的错误 这里的错误发生在logcat java lang NullPointerException Attempt to inv
  • 使用 DOM 选项定位 DataTables 元素

    我无法正确定位l长度变化和f分别过滤我的右上角和左下角的输入DT datatable输出在shiny使用dom选项 代码 library shiny library DT set seed 2282018 company lt data f
  • Firebase - 限制特定用户的文件访问权限

    我正在尝试使用 Firebase 实现以下行为 用户使用 Firebase 身份验证登录 用户将文件上传到 Firebase 存储 用户输入不同用户的电子邮件地址 该用户帐户可能已经存在 如果没有 收件人会收到一封电子邮件 提示他们注册 上
  • 在不使用 LINQ 或委托的情况下对 C# 列表 <> 进行排序

    我有一个对象列表 每个对象在 3D 空间中都有一个位置 我需要按到任意点的距离对这个列表进行排序 目前我正在这样做 attachedEffectors attachedEffectors OrderBy x gt Mathf Pow x t
  • 使用 Cypher 从 Neo4j 图中提取子图

    假设我在 Neo4j 中有一个包含 5 个节点的集合 使得集合中的每个节点都连接到集合中的至少一个其他节点 我想从 Neo4j 中提取由节点集合及其交互形成的子图 目前 我正在使用一种非常原始的方法 该方法涉及尝试找到系统中每个节点与其他每
  • 在列表视图中选择 edittexts 文本。怎么办呢?我不知道

    我有一个 ListView 每行都有一个 EditText 正在工作 我需要在单击编辑文本时选择此文本以写入数字 而无需删除或移动光标 首先使用 selectAllonfocus 有效 但是 滚动列表视图后 EditText 变得疯狂并且选
  • 如何安全地处理自定义编写的 PowerShell cmdlet 中的密码?

    假设我有一个自定义 PowerShell Cmdlet 用于导出数据并使用密码对其进行加密 Cmdlet VerbsData Export SampleData public class ExportSampleData PSCmdlet
  • React Native DateTimePicker 的日期格式?

    我正在使用 React Native DateTimePicker https github com react native datetimepicker datetimepicker The onChange事件有时间戳 但我不明白它的
  • 我想在 flutter 中访问我的系统铃声

    有什么办法可以得到所有的铃声手机使用的flutter 并将所选铃声设置为我的应用程序的默认铃声 提前致谢 我设法使用本机代码完成它 首先 您将在 Flutter 端创建这些东西 here where your ringtones will
  • nuxtjs 在点击元素时添加和删除类

    我是 vue 和 nuxt 的新手 这是我需要更新的代码
  • 在win7-64位中通过mingw使用boost.python编译一些代码

    我决定让我的程序兼容windows环境 但是我在windows上的编程经验很少 有一些错误需要帮助 环境 操作系统 win7 64位 IDE 代码块12 11 python Python 2 7 3 Windows X86 64 安装程序
  • googleapi:错误 403:需要“compute.organizations.enableXpnHost”权限

    我已在组织级别为我的用户授予我的管理员用户和服务帐户用户 计算共享 VPC 管理员 角色 但我似乎无法启用请求的权限 我还授予了拥有 namidalab dev networks 项目的文件夹级别的角色 在 IAM 和管理控制台 UI 中选
  • 获取单个 NSDateComponents 的 2 个日期之间的确切差异

    如何获得两个值之间的精确差异 以十进制表示 NSDate Eg 2016 年 1 月 15 日 to 2017 年 7 月 15 日 1 5年 我可以使用类似的东西 NSCalendar currentCalendar components
  • 在 awk 中对块内的行进行排序

    我有一个很长的文件 其中包含依赖项列表 它们的版本以及依赖项所属的服务 该文件按块排序和分隔 这是我引用的文件文件的片段 foo bar baz json jar 2 2 2 compile service ServiceTwo foo b
  • 如何在 JPanel 中为矩形设置动画?

    我想为我的项目学习一些有关 JAVA 的技巧 我想从左到右 从右到左对我的矩形进行动画处理 但我无法对球动画应用相同的功能 另外 如何以 y 坐标边框在不同的 x 方向上启动我的球 非常感谢您的建议和帮助 我的代码 import javax
  • 使用宏构建 #include 指令的路径

    我希望包含由宏为程序的目标配置相关部分动态创建的文件路径 例如 我想构造一个将像这样调用的宏 include TARGET PATH OF header h 这将扩展为这样的内容 include corefoundation header
  • 未安装的内部 Testflight 版本挂起于 90%

    我的客户正在尝试安装一个版本 每次都挂在90 有时他们会留下它 仍然挂着 然后检查应用程序并看到版本号增加 但这一次 他们让它运行了 5 分钟 但版本仍然没有更新 他们删除了该应用程序并尝试再次安装 但它没有安装 只是挂起 我该如何解决 我
  • Git 恢复:“目标文件为空”。如何重新创建树木?

    注意 我没有此存储库的任何损坏前克隆 我相信我的情况与这里描述的其他人不同 因为我缺少一棵树 而不是一个斑点 发生了什么 当我尝试通过 LAN 通过 SSH 克隆存储库时 Git 返回一条错误 指出存储库已损坏 remote error o