如何修复树与树之间的 Git 错误断开链接?

2024-05-14

我的事务被中断,当我再次尝试时,我遇到了空或损坏的对象错误,在另一个问题之后,我删除了所有空文件,当我运行时

git fsck --full

我收到这个错误:

Checking object directories: 100% (256/256), done.
Checking objects: 100% (48774/48774), done.
error: d193ccbc48a30e8961e9a2515a708e228d5ea16d: invalid sha1 pointer in cache-tree
error: df084ac4214f1a981481b40080428950865a6b31: invalid sha1 pointer in cache-tree
broken link from    tree 4bf4869299b294be9dee4ecdcb45d2c204ce623b
          to    tree df084ac4214f1a981481b40080428950865a6b31
broken link from    tree 4bf4869299b294be9dee4ecdcb45d2c204ce623b
          to    tree d193ccbc48a30e8961e9a2515a708e228d5ea16d
missing tree df084ac4214f1a981481b40080428950865a6b31
missing blob a632281618ca6895282031732d28397c18038e35
missing tree d193ccbc48a30e8961e9a2515a708e228d5ea16d
missing blob 70aa143b05d1d7560e22f61fb737a1cab4ff74c6
missing blob c21c0545e08f5cac86ce4dde103708a1642f23fb
missing blob 9f341b8a9fcd26af3c44337ee121e2d6f6814088
missing blob 396aaf36f602018f88ce985df85e73a71dea6f14
missing blob 87b9d1933d37cc9eb7618c7984439e3c2e685a11

我该如何解决这个问题?

Git


使用 Git 2.10(2016 年第 3 季度),您可以更多地了解这些损坏链接的来源。

git fsck --name-objects

See commit 90cf590 https://github.com/git/git/commit/90cf590f53f2939a47ca7b397e270e8228699829, commit 1cd772c https://github.com/git/git/commit/1cd772cc4124e43b14231dcaeae8a5dddf4ffdb9, commit 7b35efd https://github.com/git/git/commit/7b35efd734e501f9e4692768a8b6aea818c0c93e, commit 993a21b https://github.com/git/git/commit/993a21b0a05bf2e2063c58e5722c29f5747e39d4 (17 Jul 2016) by Johannes Schindelin (dscho) https://github.com/dscho.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit 9db3979 https://github.com/git/git/commit/9db397978416f9d562a94e55db86c7a45210a05c, 25 Jul 2016)

fsck:可选择显示有关损坏链接的更多有用信息

当报告提交/树/blob 之间断开的链接时,如果用户被告知如何访问该对象,有时会非常有帮助。

随着新--name-objects选项,git-fsck将尝试做到这一点:
以显示对象可访问性的方式命名对象。

例如,当某些引用日志损坏并且丢失不应丢失的 blob 时,用户可能希望删除相应的引用日志条目。
此选项可帮助他们找到该条目:git fsck --name-objects现在将报告如下内容:

  broken link from    tree b5eb6ff...  (refs/stash@{<date>}~37:)
                to    blob ec5cf80...

如果这些损坏的链接不是来自本地存储而是来自远程存储库,获取这些包对象就可以解决这个问题 https://stackoverflow.com/a/26228383/6309.
也可以看看 ”如何恢复因硬盘故障而损坏的 Git 对象? https://stackoverflow.com/a/22694491/6309".


With Git 2.31 (Q1 2021), fix "git fsck --name-objects https://github.com/git/git/blob/9e634a91c8b6f57508aa91bd7306194d6ef6c14a/Documentation/git-fsck.txt#L94"(man https://git-scm.com/docs/git-fsck#Documentation/git-fsck.txt---name-objects) which apparently has not been used by anybody who is motivated enough to report breakage.

See commit e89f893 https://github.com/git/git/commit/e89f89361cd7b706858eb22a6cf3d59d31a00acf, commit 8c891ee https://github.com/git/git/commit/8c891eed3a89ff945b7957cdf62037b2e2b6eca7 (10 Feb 2021) by Johannes Schindelin (dscho) https://github.com/dscho.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit 9e634a9 https://github.com/git/git/commit/9e634a91c8b6f57508aa91bd7306194d6ef6c14a, 17 Feb 2021)

fsck --name-objects https://github.com/git/git/commit/e89f89361cd7b706858eb22a6cf3d59d31a00acf:解析代号时要更加小心

Signed-off-by: Johannes Schindelin

In 7b35efd https://github.com/git/git/commit/7b35efd734e501f9e4692768a8b6aea818c0c93e (fsck_walk():可选择随时随地命名对象,2016-07-17,Git v2.10.0-rc0 --merge https://github.com/git/git/commit/9db397978416f9d562a94e55db86c7a45210a05c列于batch #7 https://github.com/git/git/commit/8c6d1f9807c67532e7fb545a944b064faff0f70b) (fsck_walk():可选择在旅途中命名对象,2016-07-17),fsck机器学会了有选择地命名对象,这样就可以更容易地看到存储库的哪个部分状况不佳,例如,当对象丢失时。

为了节省复杂性,该机制使用解析器来确定给定提交名称的父级名称:任何~<n>后缀被解析,父母的名字由前缀和~<n+1>.

然而,这个解析器有一个错误:如果它找到后缀<n>那是not ~<n>,它会将空字符串误认为前缀并且<n>为世代数。
换句话说,它将生成一个以下形式的名称~<bogus-number>.

让我们解决这个问题。


With Git 2.40 (Q1 2023), "git hash-object https://github.com/git/git/blob/abf2bb895b429e9fefc478d9c230bf74622be620/Documentation/git-hash-object.txt"(man https://git-scm.com/docs/git-hash-object) now checks that the resulting object is well formed with the same code as git fsck".

See commit 8e43090 https://github.com/git/git/commit/8e4309038f0a72aef950f87fe187af824fc8efc0 (19 Jan 2023), and commit 69bbbe4 https://github.com/git/git/commit/69bbbe484ba10bd88efb9ae3f6a58fcc687df69e, commit 35ff327 https://github.com/git/git/commit/35ff327e2da2e9fa9820643d2e44f3b30530d06c, commit 34959d8 https://github.com/git/git/commit/34959d80db602b7d6893c9e2dfa81d78fd16f702, commit ad5dfea https://github.com/git/git/commit/ad5dfeac040c16057a23f341408d229656e42ab4, commit 61cc4be https://github.com/git/git/commit/61cc4be7ec21f0217abacc396287ca12c68e923d, commit 6e26460 https://github.com/git/git/commit/6e2646075c456f2bd3dfe6afd7d72316174b02ed (18 Jan 2023) by Jeff King (peff) https://github.com/peff.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit abf2bb8 https://github.com/git/git/commit/abf2bb895b429e9fefc478d9c230bf74622be620, 30 Jan 2023)

hash-object https://github.com/git/git/commit/69bbbe484ba10bd88efb9ae3f6a58fcc687df69e: use fsck用于对象检查

Signed-off-by: Jeff King

Since c879daa https://github.com/git/git/commit/c879daa23729547fb28aa7e8783c5e4e619a9e7c ("Make hash-object对格式错误的对象更强大”,2011-02-05,Git v1.7.5-rc0 --merge https://github.com/git/git/commit/fc7ae9c156775cc9679c0bcc7156abb7dba1bd3a),我们通过我们常用的树、提交和标签解析器运行它们,对我们即将编写的对象进行了一些基本检查。

这些解析器发现了一些问题,但它们并不像fsck函数(这是有道理的;解析器被设计为快速且宽容,仅当输入难以理解时才放弃)。
我们最好做得更彻底fsck写入对象时进行检查。
在写入时这样做比编写垃圾后才发现(在其上构建更多历史之后!)要好得多fsck对此进行投诉,或者房东transfer.fsckObjects拒绝它。

这显然将是用户可见的行为更改,本系列前面的测试更改显示了影响的范围。
但我认为这是可以的:

  • the documentation for hash-object is already vague about which checks we might do, saying that --literally will allow any garbage[...] which might not otherwise pass standard object parsing or git-fsck https://github.com/git/git/blob/69bbbe484ba10bd88efb9ae3f6a58fcc687df69e/Documentation/git-fsck.txt(man https://git-scm.com/docs/git-fsck) checks".
    So we are already covered under the documented behavior.
  • 无论如何,用户通常不会运行 hash-object。
    测试中有很多地方需要更新,因为创建垃圾对象是 Git 测试不成比例的事情。
  • 很难想象有人会认为新行为更糟糕。
    我们拒绝的任何对象都将成为用户未来的潜在问题。
    如果他们真的想制造垃圾--literally已经是他们需要的逃生口了。

Note that the change here is actually in index_mem(), which handles the HASH_FORMAT_CHECK flag passed by hash-object.
That flag is also used by "git-replace --edit https://github.com/git/git/blob/69bbbe484ba10bd88efb9ae3f6a58fcc687df69e/Documentation/git-replace.txt"(man https://git-scm.com/docs/git-replace) to sanity-check the result.
Covering that with more thorough checks likewise seems like a good thing.

除了更彻底之外,还有一些其他好处:

  • 我们摆脱了一些有问题的对象结构的堆栈分配。
    这些目前似乎在实践中不会造成任何问题,但它们巧妙地违反了其余代码所做的一些假设(例如,我们放在堆栈上的“结构提交”和零初始化将没有适当的值)索引来自alloc_comit_index().

  • 同样,那些解析的对象结构是一些小内存泄漏的根源

  • 由此产生的消息要好得多。
    例如:

    [before]
    $ echo 'tree 123' | git hash-object -t commit --stdin
    error: bogus commit object 0000000000000000000000000000000000000000
    fatal: corrupt commit
    
    [after]
    $ echo 'tree 123' | git.compile hash-object -t commit --stdin
    error: object fails fsck: badTreeSha1: invalid 'tree' line format - bad sha1
    fatal: refusing to create malformed object
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修复树与树之间的 Git 错误断开链接? 的相关文章

  • 如何使用 API 和 C# 将文件从 azure DevOps 服务器下载到指定路径

    我正在尝试使用 API 从 azure Devops 服务器下载文件 API 给出了成功响应 但是没有下载任何文件 如果我们删除格式参数 我们将获得带有文件链接的响应 单击该文件不会下载 示例代码 var personalaccesstok
  • 如何为 github 中两个分支之间的单个文件生成差异

    我需要为单个文件生成一个 diff 以显示两个版本之间的差异 这实际上是 github 中的标签 然后我想通过电子邮件将此差异发送给某人 因此差异的 github URL 将是理想的选择 github 比较视图将允许我对所有更改的文件执行此
  • git 分叉是如何工作的?

    所以我登录了 github 并 fork 了一个项目 每次原始存储库更新时 我的分叉存储库都会更新吗 或者我应该每次都从原始存储库进行分叉 这样我就不会错过对原始存储库所做的任何新更改 分叉是存储库的副本 分叉存储库允许您自由地尝试更改 而
  • `git add --patch` 和 `--word-diff`

    git add patch提供了一个很好的界面 用于检查未暂存的更改 然后仅暂存下一次提交中需要的更改 很好 除了一件事 没有明显的方法来选择哪个diff视图来使用 特别是 我希望能够配置git add patch以同样的方式向我呈现差异g
  • .gitignore 文件夹内容[重复]

    这个问题在这里已经有答案了 可能的重复 在 Windows 上忽略 Git 存储库中的目录 https stackoverflow com questions 343646 ignoring directories in git repos
  • 恢复 git reset --soft

    我修改了我的分支中的一些文件并做了一个 git add all 但这添加了一些我不打算为提交添加的文件 所以我做了一个 git reset soft HEAD 2 instead of doing git reset HEAD 但之前的提交
  • 无法将 android“gen”文件夹提交到 Git

    我在 eclipse 中使用 EGit 为我正在开发的 Android 项目提供 Git 支持 问题是 将我的项目提交到本地存储库后 我意识到 gen 文件夹没有被提交 因此 当我从 Git 存储库获取最新源代码后尝试在另一台计算机上打开该
  • 如何让 git 和 copSSH 在正确的目录中查找密钥?

    我刚刚安装了 Windows 版 copSSH 当我启动它时 我得到一个目录C copSSH home Nick ssh其中有我的酒吧和私钥 当我通过 Cygwin bash 窗口访问此目录时 使用 ssh 用户 主机 我很高兴地登录了 但
  • 无法将 git add origin git@anything 与新的 git 目录一起使用

    我有一个项目 我正在生成许多提交 因此它占用的空间正在快速增长 由于我有一个 gitlab 页面来推送提交 因此我决定最好删除本地 git 目录中的这些旧提交 因为我始终可以从 gitlab 获取它们 为此 我只需删除本地 git 目录 然
  • 如何标记单个文件?或如何下载特定文件? - 胃肠道

    我想向文件添加标签以轻松下载该文件而不是整个分支 如何下载GIT中的特定文件 我不知道有什么方法可以标记特定文件git 对于第二个问题 如何下载特定文件git 仅当您的意思是 同时下载 时 以下内容才有效in a git存储库 这就是我理解
  • Git 中的“分支提示”是什么?

    我正在学习 Git 并阅读专业 Git 书籍 https git scm com book en v2 书中和 Stack Overflow 上有时会使用术语 分支提示 但我找不到它的含义 分支提示是分支上的最后一次提交或最近一次提交 基本
  • 如何使用 sourceTree 进行推送?

    我正在使用 sourceTree 管理 Unity 项目 版本 4 6 3 我只是想返回到上一次提交 右键选择 将当前分支重置到此提交 在使用模式中选择 硬 然后放回上一次提交 之后 我尝试去推 但没有成功 抱歉 当时我忘记了错误 之后 我
  • 通过链接进入 git-repo,无需冗长的对话框

    In a directory I have symbolic links into a git administered directory all under Linux Every time I want to e dit such a
  • 如何通过哈希显示提交的日期和时间

    I used git reflog识别我创建特定分支时的哈希值 我得到了哈希值fe1ddcdef 我还没有将此分支推送到远程 我现在正在尝试查找日期和时间fe1ddcdef发生 git reflog只告诉我 fe1ddcdef HEAD 1
  • 如何查看 github 的 SSH 密钥?

    我最近收到一封来自 Github 的电子邮件 要求我检查我的 SSH 密钥 请检查您的钥匙并确保您 认出他们 如果您有任何疑问 请拒绝钥匙并 上传新密钥 如何在 ubuntu 11 10 上使用 git 检查我的密钥 您可以按照 GitHu
  • Eclipse 与外部 src 和 Web 内容文件夹链接或映射

    首先这不是问题但是我遇到的问题的解决方案浪费了4 5个小时来找到解决方案 请让我知道是否有更好的替代方法来使用 eclipse 项目管理外部 src 文件夹 我正在使用版本控制系统 GIT 来管理我的项目 还使用外部 Git 客户端 Sou
  • 如何使用 vim 作为“git show”编辑器?

    全部如所述如何使用 vim 作为 git log 编辑器 https stackoverflow com questions 16666009 how do i use vim as git log editor不适用于 git show
  • TeamCity 将功能分支推送到主分支

    有没有办法将成功构建的功能分支推送到另一个分支 我想要这样的东西 Git 存储库 Gitorious GitHub 等 分支机构 master 当前项目的代码 质量保证 代码等待 QA 的分支 功能分支 许多远程分支 开发人员可以在其中开发
  • 如何解决 VS Code 中变基拉取的合并冲突?

    当我做一个git pull rebase 并且我的提交中存在合并冲突 我得到冲突差异视图 解决所有冲突并暂存文件 然后呢 我可以打开终端并运行git rebase continue但是 VS Code 中不应该有一个按钮来完成变基吗 只需使
  • 在centos上设置jenkins:ssh密钥和git的问题

    经历了很多问题 但似乎没有什么能解决我的问题 或者更准确地说 我不确定我是否正确地完成了整个事情 所以这里是 已安装centos 6 3操作系统 然后我按照以下指南安装詹金斯 https wiki jenkins ci org displa

随机推荐

  • 线程池,C++

    我正在使用 C 开发一个网络程序 我想实现一个 pthread 池 每当我从接收套接字接收到一个事件时 我都会将数据放入线程池中的队列中 我正在考虑创建 5 个独立的线程 并将持续检查队列以查看是否有任何传入数据需要完成 这是一个非常简单的
  • 在 C# 中创建一副纸牌

    因此 我正在尝试为我的一个编程课程创建一副纸牌 我从来没有真正做过这样的事情 如果我犯了一些愚蠢的错误 我很抱歉 我正在 Visual Studio 中对此进行编码 按照类规则 我正在尝试为我的 Deck 创建一系列 Card 对象 我遇到
  • 多 AVL 树旋转

    假设我有一个无序集合 s 3 6 5 1 2 4 并且我需要构造一个 AVL 树 就这么多了 我了解基本的旋转 我在这里达到这一点 5 2 6 1 3 但当我尝试插入 4 时 一切都崩溃了 我得到的最终答案是 左边的 4 But the a
  • iPhone OS 3.0.1 会毁掉你的开发手机吗?

    我将手机更新到3 0 1 虽然手机作为手机工作正常 xcode http en wikipedia org wiki Xcode组织者不再知道手机的名称 它还说这个版本的 xcode 不支持 3 0 1 我下载了最新版本的xcode和操作系
  • 使用把手显示来自 parse.com 的 json 响应

    我想将 json 响应传递给车把 我已经查看了解析文档和 stackoverflow 问题 但我似乎无法弄清楚这一点 这是回应 results address 755 W Yale createdAt 2013 02 09T01 12 15
  • 开源 EDA 项目

    您知道 EDA 电子设计自动化 领域有哪些开源项目正在寻找 C 程序员吗 如果您经常关注 gEDA 的邮件列表 您也许能够加入 gEDA 细节 http www gpleda org developer html http www gple
  • Webpack 子编译器更改配置

    我希望在编译我的服务工作人员时将我的 webpack 构建的输出定义为变量 我想使用子编译功能来编译放入不同路径的服务工作人员 我需要 webpack 编译发出的输出来正确编译服务工作线程 我最初的做法是使用与离线插件相同的策略 在其中创建
  • 为什么 Mac OS 上的 C 运行时允许预组合和分解的 UTF-8?

    所以我们都知道 Mac OS 上的文件系统具有使用完全分解的 UTF 8 的古怪功能 如果您调用 POSIX API 例如realpath 例如 您将从 Mac OS 返回这样一个完全分解的 UTF 8 字符串 当使用像这样的 API 时f
  • 从所有表中选择

    我的数据库中有很多表都具有相同的结构 我想从所有表中进行选择 而不必像这样列出所有表 SELECT name FROM table1 table2 table3 table4 我尝试过 但这不起作用 SELECT name FROM 有没有
  • 从文件中读取未知长度的int数组

    如何从文件中读取未知长度的整数数组 我没有找到获取数组大小的方法 所以我尝试了一些临时字符串的东西 但我的代码爆炸了 有更好的想法吗 Use std vector std ifstream inFile fileName std vecto
  • Laravel 5.3 Eloquent 事务和外键限制

    我正在从事一个更大的项目 我们在一个 Postgres 数据库中有多个模式 我们在模式之间创建了外键 这是一个例子 gt 我们有公司模式和用户模式 公司模式有company users表 该表对user users表有外键限制 CREATE
  • PostgreSQL 如何创建数据库或模式的副本?

    有没有一种简单的方法可以在 PostgreSQL 8 1 中创建数据库或模式的副本 我正在测试一些软件 它对数据库中的特定模式进行大量更新 我想复制它 以便我可以与原始版本进行一些比较 如果它位于同一服务器上 则只需使用带有 TEMPLAT
  • Apache mod_rewrite 将双斜杠转换为单斜杠

    我有一个像这样的网址 http example com img php url http example2 com path to image name jpg 所以我通过这个问题创建了一条规则Apache mod rewrite 复杂 U
  • 如何检测环境是在 Azure 托管服务工作者角色中进行暂存还是生产?

    我在托管服务中担任辅助角色 工作人员每天都会发送电子邮件 但在托管服务中 有 2 个环境 Staging 和 Production 所以我的工人角色每天发送电子邮件 2 次 我想知道如何检测工人是否处于停滞状态或生产状态 提前致谢 根据我的
  • BracketAlignmentStyle:在右括号之前中断

    结合开括号后对齐 BracketAlignmentStyle 选项BinPackArguments and BinPackParameters set to false 可以得到以下格式 someShortFunction argument
  • 递归方法比交互式方法慢 10 倍 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 代码已尽可
  • 如何将脚本作为 pytest 测试运行

    假设我有一个用简单脚本表示的测试assert 陈述 请参阅背景了解原因 例如 import foo assert foo 3 4 我如何以一种好的方式将该脚本包含在我的 pytest 测试套件中 我尝试了两种有效但不太好的方法 一种方法是将
  • 如何识别 SQL Azure 中的死锁?

    我有一个由两个实例组成的 Windows Azure 角色 有时交易会失败并显示SqlException与以下文字 事务 进程 ID N 在锁资源上与另一个进程发生死锁 并被选为死锁牺牲品 重新运行事务 现在我已经谷歌搜索了一段时间并阅读这
  • 设置 location.hash 时防止默认行为

    当我这样做时 location hash test url 会更新 页面会定位到具有该 id 的元素 有没有办法阻止页面定位到该元素 Solution 您无法阻止这种行为 但您可以通过暂时隐藏目标来愚弄它 例如 像这样 与 jQuery 无
  • 如何修复树与树之间的 Git 错误断开链接?

    我的事务被中断 当我再次尝试时 我遇到了空或损坏的对象错误 在另一个问题之后 我删除了所有空文件 当我运行时 git fsck full 我收到这个错误 Checking object directories 100 256 256 don