【问题标题】:How to remove "fatal: loose object"?如何删除“致命:松散的物体”?
【发布时间】:2021-02-09 00:10:56
【问题描述】:

我的一个克隆存储库是从 git fsck 获取的

致命:松散对象 40bda4e3b79c3d7bf598df31d9e68470f97a3f79(存储在 .git/objects/40/bda4e3b79c3d7bf598df31d9e68470f97a3f79 中)已损坏

我有另一个 fsck 干净的副本。

我已经尝试对包含致命目录/子目录的目录/子目录进行核对,并且 重新克隆它。问题还在继续。

我真的不关心任何特定的文件,我只希望存储库 干净地结帐。我该怎么办?

注意:远程存储库托管在 github 上。

【问题讨论】:

标签: git github


【解决方案1】:

简单的答案:将旧的 repo 移走并重新克隆。如果您想要保留旧仓库中的东西,有办法获得它们,但首先要获得一个好的仓库。

【讨论】:

  • 我核对了存储库/目录结构并重新克隆。问题仍然存在。是否有另一种方法可以将旧的仓库“移走”?
  • @fishtoprecords: git fsck 返回失败,对吧?然后cd ..; mv reponame reponame-fatal-loose-object; git clone URL reponame
  • 谢谢,我发誓我以前做过一次,但这次效果很好。
  • 然后是 cp -rf reponame-fatal-loose-object/* reponame/ ?
  • 这个答案对我来说更好。不需要火箭科学,因为如果有疑问,只需克隆一个新的并备份旧的 git repo 并用新的替换它。
【解决方案2】:

想法是:

  1. 首先删除当前项目下的 .git 中的当前 git 记录(我们将其表示为“项目 A”)。
  2. 复制您当前的项目,我们将副本表示为“项目 B”。
  3. 现在 cd 进入项目 A 和 git clone 并重置为最后一次提交。
  4. 复制项目 B 中的所有文件并替换项目 A 中的文件。
  5. 现在cd 进入项目A 并使用git status 来查看项目A 的状态。应该就好像从来没有发生过损坏一样。

简而言之,制作一个副本以保留您当前的工作区域,并通过替换文件将其与新克隆合并,然后正常处理您的更改。

下面是实际操作:

  1. 首先我看到我有一个损坏(这是因为我昨天强制我的虚拟机不正常关闭:P):

    ✘ domicor@ubuntu  ~/dotfiles   master ●  git status 错误:目标文件 .git/objects/cd/593f6db1d5050406e15b9c80d215fd48db39f4 为空 错误:目标文件 .git/objects/cd/593f6db1d5050406e15b9c80d215fd48db39f4 为空 致命:松散对象 cd593f6db1d5050406e15b9c80d215fd48db39f4(存储在 .git/objects/cd/593f6db1d5050406e15b9c80d215fd48db39f4 中)已损坏

  2. 复制我的dotfiles 文件夹,现在删除.git 文件夹。

    $ cd ~/dotfiles $ rm -rf .git

  3. 然后重新创建一个 git repo。

    $ git 初始化

  4. 添加遥控器。

    $ git remote add origin git@git.oschina.net:domicor/dotfiles.git

  5. 从远程获取。

    $ git fetch

    这是上述命令的屏幕截图:

  6. 现在重置 HEAD。

    $ git reset --hard origin/master

    这是照片:

    请注意,在我从远程获取后,我立即发出了git status 命令来检查我的回购的状态。您可以看到所有文件都未跟踪。命令行提示符的第一部分从我的git init 命令到git reset 命令是橙色的,表示当我初始化我的存储库时,git 检测到文件,并且在重置后,所有文件都恢复到 HEAD 的状态,因此绿色提示。

  7. 设置上游分支:

    $ git branch --set-upstream-to=origin/master master

  8. 现在手动或通过命令行从备份文件夹(对我来说是dotfiles (copy))复制您的文件以替换dotfiles 文件夹中的文件。检查状态,应该有变化,就像我的屏幕截图一样:

  9. 现在您可以git diff your-filename 检查您的更改是否已正确应用,并且您可以从现在开始添加文件并提交。 \o/

为了进一步理解它,git VCS 只是记录您的更改。当 VCS 损坏时,您的文件仍然是安全的。当你离开他们时,他们还在那里。因此,您备份文件并从其他地方恢复 git 记录,git 可以将恢复副本与您当前的文件状态进行比较,并了解发生了什么变化,就像它在损坏之前所做的那样。欢呼声\o/

【讨论】:

  • 谢谢,您的详细回答是迄今为止最有用的!我使用"rsync -ria --progress <dotfiles (copy)>/* <dotfiles>/" 复制我的更改。
  • 顺便说一句 - 你在这里使用什么样的 git-aware bash-prompt?编辑:找到了,ZSH 的 Agnoster (github.com/agnoster/agnoster-zsh-theme)
【解决方案3】:

首先,您可以检查文件系统是否有错误:fsck -y

然后,检查 git 存储库:git fsck

【讨论】:

    【解决方案4】:

    我遇到了这个问题,这个简单的技巧解决了这个问题。

    步骤 1

    假设您在名为“my-project”且分支为“my-new-feature”的文件夹中遇到此问题,请将 repo 克隆到名为“my-project-dummy”的新文件夹并签出到“my-new” -特征”

    第二步

    删除“my-project”文件夹中的“.git”文件夹并将“.git”文件夹从“my-project-dummy”文件夹复制到“my-project”

    Tadaaa,你现在可以走了。

    【讨论】:

    • 这就像一个魅力。您不需要像其他答案建议的那样移动您的 repo 文件。我什至在 repo 中有未提交的更改,并且无需执行任何其他操作即可将它们恢复。
    【解决方案5】:

    对另一个分支执行git checkout,您将获得更改文件的列表,只需将它们提交并推送到分支。 如果您这样做,问题将得到解决,下次您进行一些更改时git status 应该可以工作。

    【讨论】:

      【解决方案6】:

      你应该重新创建一个 repo:

      • 删除 .git 文件夹
      • 将工作目录中的所有内容复制到备份目录
      • git 初始化
      • git远程添加源https://github.com/USERNAME/REPONAME.git
      • git 拉
      • git checkout -b 备份
      • git 添加。
      • git commit -m "添加备份"
      • git checkout master
      • 你回来了(主分支)

      【讨论】:

        【解决方案7】:

        最简单的答案是“rm -rf .git ...” http://www.bazhukov.net/2015/02/git-corrupt-loose-object/

        【讨论】:

        • 这个链接是俄语的。我认为任何理智的软件人都无法使用它。
        • 当您看到损坏的消息时使用以下命令: 1. rm -rf .git 2. git init 3. git remote add origin repository_address 4. git fetch 5. git reset --hard origin/master
        • 请不要这样做,或者只有在您知道自己要进入的内容时才这样做。最后的reset --hard 步骤将使您丢失存储库中任何未提交的更改。
        • 关于这种修复的更详细解释在stackoverflow.com/a/13918515
        猜你喜欢
        • 2021-11-05
        • 2020-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-16
        • 2020-02-17
        • 1970-01-01
        • 2019-11-05
        相关资源
        最近更新 更多