25

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

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

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

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

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

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

4

7 回答 7

31

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

于 2012-07-22T01:05:11.760 回答
7

这个想法是:

  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 error: object file .git/objects/cd/593f6db1d5050406e15b9c80d215fd48db39f4 is empty error: object file .git/objects/cd/593f6db1d5050406e15b9c80d215fd48db39f4 is empty fatal: loose object cd593f6db1d5050406e15b9c80d215fd48db39f4 (stored在 .git/objects/cd/593f6db1d5050406e15b9c80d215fd48db39f4) 已损坏 损坏的

  2. 制作我的文件夹的副本,dotfiles然后删除该.git文件夹。

    $ cd ~/dotfiles $ rm -rf .git

    点文件

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

    $ 混帐初始化

  4. 添加遥控器。

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

  5. 从远程获取。

    $ git 获取

    这是上述命令的屏幕截图:rm-clone-fetch

  6. 现在重置 HEAD。

    $ git reset --hard origin/master

    这是截图:重置

    请注意,在我从远程获取之后,我发出了一个git status命令来检查我的仓库的状态。您可以看到所有文件都未跟踪。从我的git init命令到git reset命令,命令行提示的第一部分是橙色的,表示当我初始化我的 repo 时,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/

于 2016-07-10T13:23:08.137 回答
4

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

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

于 2013-09-11T10:45:12.170 回答
4

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

步骤1

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

第2步

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

Tadaaa,你现在可以走了。

于 2019-08-14T07:02:57.897 回答
0

你应该重新创建一个回购:

  • 删除 .git 文件夹
  • 将所有内容从工作目录复制到备份目录
  • 混帐初始化
  • git 远程添加源https://github.com/USERNAME/REPONAME.git
  • git 拉
  • git checkout -b 备份
  • 混帐添加。
  • git commit -m "添加备份"
  • git结账大师
  • 你回来了(主分支)
于 2021-02-08T16:10:56.780 回答
0

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

于 2015-09-11T18:55:28.167 回答
-4

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

于 2015-05-21T18:50:47.753 回答