从远程仓库克隆后编写Git对象文件

8

我已经为这个问题苦苦挣扎了数小时。我的本地代码库中某个提交记录不知何故丢失了。

> git reflog expire --stale-fix --all
error: refs/tags/12.01.02 does not point to a valid object!
error: Could not read 95eeac3b5f441c9ebbd89508896c572e3eb17205
fatal: Failed to traverse parents of commit 6c24f6ea7c0452e70dea6332c6959dad6c71305f

并且

$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (159800/159800), done.
error: refs/tags/12.01.02: invalid sha1 pointer 95eeac3b5f441c9ebbd89508896c572e3eb17205
error: HEAD: invalid reflog entry 95eeac3b5f441c9ebbd89508896c572e3eb17205

我一直在寻找解决问题的方法,特别是我遇到了这个答案
引用:

您可以尝试的第一件事是从备份中恢复丢失的项目。例如,查看是否有存储为.git / objects / 98 / 4c11abfc9c2839b386f29c574d9e03383fa589的提交备份。如果有,可以将其还原。

因此,我发现提交在GitHub上的远程库中。所以我在不同的目录中进行了全新的克隆,但是/objects大部分为空。有没有办法仅为一个提交重新生成对象文件?

你的本地代码库中有多少个提交在缺失提交后尚未推送到GitHub,并且保持历史记录对你有多重要? - Stephen Kennedy
@StephenKennedy 我最终不得不承认失败,只能从Github上拉出一个新的克隆。我能够重建我所失去的微不足道的东西。 - Machavity
3个回答

4
如果你发现提交已经在远程了,那么最简单的方法可能是获取该提交(这也会拉取任何依赖对象,比如提交的内容,或者构成该提交历史记录的其他提交)。
你可能无法直接从远程获取特定的提交,因为任意的提交 ID 通常不被接受作为 fetch 的参数。但是你可以进行本地克隆,所以你可以。
$ cd path/of/new/clone
$ git checkout 95eeac3

结账应该让您进入分离头状态,这将打印一个冗长的警告和说明; 但它应该成功。如果出错,则可能是关于提交在远程(和/或新克隆)中的某些观察错误。

假设结账确实有效,那么您将

$ git branch my_temp_branch
$ cd path/of/original/clone
$ git remote add temp file://localhost/path/of/new/clone
$ git fetch temp my_temp_branch

有许多变体的命令序列;这个使用足够熟悉的语法,我相当确定我没有测试实例在我的面前,尽管其他方法可能更加简洁。


这里变得越来越热了。所以fetch出现了错误,显示为remote: Total 0 (delta 0), reused 0 (delta 0) fatal: bad object 95eeac3b5f441c9ebbd89508896c572e3eb17205 error: C:/code/platform-new did not send all necessary objects。有什么想法吗? - Machavity

3
从其他地方克隆下来的新副本,如果有该对象,则会在一个打包文件中。请参见如何解压单个git对象?了解从打包文件中提取单个打包对象的方法。
你可能会发现,一旦你获得了第一个缺失的对象,你需要更多的对象。从技术上讲,一个对象可以存在多次(例如,在多个打包文件中),只要在任何拥有它的打包中查找该对象并使用结果,就能得到与在任何其他拥有它的打包中查找相同对象时得到的结果相同的位。如果仓库是相关的,那么这应该是正确的,因此您可以将打包文件放入“坏”仓库中以添加所有其对象(某些可能是多余的)。
如果您确实使Git接受了“坏”副本,则最好将其重新克隆到新副本中(您可能想使用git clone --mirror进行此操作)。

0

你可以使用 git fetch 命令从远程获取特定的对象。

尝试运行:

git fetch origin 95eeac3b5f441c9ebbd89508896c572e3eb17205

另外一个角度是:执行git fsck的结果指出唯一失败的事项是您的本地标签12.01.02无效。

  • 删除此本地标签:git tag -d 12.01.02
  • 如果您需要它,请从origin获取它:git fetch origin 12.01.02

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接