【发布时间】: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-name、git 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 或类似的。