代码之家  ›  专栏  ›  技术社区  ›  Machavity Labib Hussain

从远程repo克隆写入git对象文件

git
  •  4
  • Machavity Labib Hussain  · 技术社区  · 7 年前

    我已经为这个问题绞尽脑汁好几个小时了。我的本地回购协议不知怎的错过了一个承诺

    > 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
    

    this answer :

    因此,我发现提交在GitHub的远程服务器中。所以我在另一个目录中做了一个新的克隆,但是 /objects 大部分是空的。是否有方法仅为一次提交重新生成对象文件?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Mark Adelsberger    7 年前

    如果您发现提交位于远程,那么最简单的事情可能是获取提交(这也将拉入任何依赖对象,例如提交的内容或构成该提交历史记录的其他提交)。

    您可能无法直接从远程获取特定的提交,因为一般不接受任意提交ID作为获取参数。但是你做了一个本地克隆,所以你可以

    $ 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
    

    (该命令序列有很多变体;这一个使用了足够熟悉的语法,我可以合理地确定我的语法是正确的,尽管前面没有测试实例,但其他方法可能更简洁。)

        2
  •  3
  •   torek    7 年前

    来自其他地方的新克隆将在包文件中包含该对象(如果它包含该对象的话)。看见 How do I unpack a single git object? 用于从打包文件中提取一个打包对象的方法。

    您可能会发现,一旦有了第一个丢失的对象,您就需要更多的对象。从技术上讲,拥有一个对象不止一次(例如,在多个包中)是可以的,只要在拥有该对象的任何包中查找该对象,并使用结果可以获得与在任何其他也有该对象的包中查找同一对象相同的位。如果存储库是相关的,则应该是这样,因此您可以将包文件放到“坏”repo中进行添加 全部的 它的对象(有些可能是多余的)。

    如果并且当您确实让Git对“坏”克隆满意时,最好将其重新克隆到新克隆(您可能希望使用 git clone --mirror 为此)。

        3
  •  0
  •   LeGEC    7 年前

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

    尝试运行:

    git fetch origin 95eeac3b5f441c9ebbd89508896c572e3eb17205
    

    另一个角度是:结果 git fsck 声明唯一失败的事情是你的 本地标签 12.01.02 他病了。

    • 删除此本地标记: git tag -d 12.01.02
    • 如果需要,请从源站取回: git fetch origin 12.01.02