【问题标题】:git lfs pushed only the placeholder filegit lfs 只推送占位符文件
【发布时间】:2018-03-28 15:03:40
【问题描述】:

我尝试使用现有的 git-lfs 存储库并将其推送到辅助远程。在辅助遥控器上,一个 LFS 文件似乎被推送,好像 git-lfs 的“占位符”文件(三行的文本文件:版本、oid、大小)是真正的文件。尝试克隆辅助遥控器也失败了:Smudge error: Error downloading ... Object does not exist on the server

辅助遥控器有其他正确存储的 LFS 文件。有问题的文件也正确存储在 repo 的“主”远程和我的本地存储库中(意思是:我看到的是实际文件,而不是占位符)。

我不确定这是如何/为什么发生的(git lfs 已在我的本地仓库中初始化,据我所知已安装推送挂钩),但我想推送实际文件。我该怎么做?

我尝试过git lfs push --all secondary-remote branch-namegit lfs push secondary-remote --object-id "abc123",但似乎都没有任何效果(它们都打印“上传 LFS 对象:100% ...”消息,但文件仍然没有出现在远程)。

编辑:一位同事做了一个git lfs pull 和一个git lfs push,它似乎解决了问题。不过我不太清楚为什么,因为我的本地仓库已经签出了实际的二进制文件。

【问题讨论】:

  • 占位符就Git本身而言的真实文件。辅助存储库需要设置一个“涂抹”过滤器,以便它知道,一旦作为占位符的真实文件从 Git 中出来,辅助存储库应该在工作树中替换它使用伪造文件,这是来自 LFS 服务器的内容,Git 本身完全不知道。换句话说,辅助遥控器尚未设置为正确欺骗 Git。我不使用 Git-LFS,所以我不确定如何进行设置部分。
  • @torek AFAIK .gitattributes 设置过滤器,它被签入并推送到辅助存储库。虽然我其实并不太关心远程(本例中为github)是否正确显示文件,只关心是否可以检出,在这种情况下不能检出,错误为`Smudge error: Error正在下载....服务器上不存在对象`。所以我不认为污迹过滤器是(唯一的)问题。
  • 我根本不知道如何让 GitHub 读取 LFS-server 文件,但它需要的不仅仅是.gitattributes,因为它告诉了要使用哪个过滤器但没有定义过滤器本身(过滤器定义在.git/config.gitconfig 文件中)。间接文件(实际上是告诉 Git 的谎言)是否提供了完整的 URL 或只是 LFS 服务器上的路径?
  • @torek 我的印象是 GitHub 的存储库预先配置了 LFS 挂钩。已经有其他 LFS 文件推送到此远程,并且可以正常工作。我不确定您指的是哪个 URL - 间接文件包含版本、哈希和大小。
  • version/hash/size 告诉一些 LFS 服务器(不是 Git 服务器)要检索什么。但是什么服务器?它不是 Git 服务器。服务器将由单独的 URL 指定,例如 host.name/top/path 或类似的。

标签: git git-lfs


【解决方案1】:

在我在那里安装 git lfs 之前,我将 LFS 文件下载到我的仓库时遇到了同样的问题。安装后,文件只包含链接。

正如在问题的编辑中,当我运行时

git lfs pull
git lfs push  

installing git lfs 之后文件得到更新。

(不知道这是否是一个完整的答案,但这是我发现解决这个问题的唯一地方。也许它对更多人有帮助。)

【讨论】:

    【解决方案2】:

    对我来说造成同样问题的是本地 gitconfig 文件中的混淆。

    具体来说,git 服务器的“lfs”部分有错误的地址 - 它指向我为测试创建的临时本地“服务器”。所以 git lfs 将二进制文件推送到本地“服务器”并认为一切正常

    我不确定是什么导致了混淆,可能是 git lfs 中的错误,或者可能是我做错了什么。

    在我的例子中,配置文件有这些部分:

    [lfs]
        access = basic
    [lfs "file:///<SOME_LOCAL_PATH>"]
        access = basic
    
    1. 我删除了带有“空”lfs 的第一部分

    2. 我将第二部分中的 url 更改为服务器的真实 url,加上后缀。就我而言,它是一个 Azure 服务器,所以我将其更改为:

        [lfs "https://my.azureaddress.com/OrgName/_git/RepoName.git/info/lfs"]
            access = basic
    
    1. 我运行了以下命令来重新推送:

      git lfs push --all

    然后我可以在新服务器上看到我的文件并且 git clone 成功运行。

    你也可以通过运行来仔细检查

    git lfs env 
    

    这将打印一堆行,请注意“端点”行,如果它们与您的预期不同,那么我上面描述的内容可能会对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2020-01-03
      • 2021-12-22
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2022-10-23
      相关资源
      最近更新 更多