【问题标题】:Where are git-lfs files stored?git-lfs 文件存储在哪里?
【发布时间】:2016-03-14 21:02:03
【问题描述】:

我正在尝试弄清楚如何使用 git-lfs。我使用的是 gitlab EE 服务器。

也许我错过了一些东西,但除了介绍“track”命令的非常简短的教程和可爱的 1 分钟视频之外,我找不到任何关于 git-lfs 的文档。

例如,我在一个 repo 中添加和跟踪一个 3.7GB 的 tar 文件,然后推送它:

git lfs track "*.tar"
cp <a folder>/a.tar .
git add a.tar 
git commit -m "add a.tar"
git push origin master

问题一:在这个过程结束时,gitlab服务器上是否上传了a.tar?目前还不清楚“添加”和“提交”命令需要一些时间(可能时间不足以让我怀疑在此期间是否上传了 3.7GB),但推送根本不需要任何时间(一小部分第二)。

问题2:如果文件是上传到服务器的,在哪里?显然与回购不在同一个地方(这就是重点)。我问是因为我的服务器正在备份,我需要知道使用 git-lfs 是否需要我以任何方式更新它。

问题 3:如果文件没有上传,这是否意味着 repo 的其他用户将在添加文件的原始机器上获得该文件的链接?有没有办法将其更改为服务器上的位置? (回到问题2)

问题 4:克隆 repo 后,确实不存在完整的 3.4G 文件,“只是”包含内容的文本文件:

version https://git-lfs.github.com/spec/v1
oid sha256:4bd049d85f06029d28bd94eae6da2b6eb69c0b2d25bac8c30ac1b156672c4082
size 3771098624

这当然很棒,而且很重要。但是如果需要访问完整文件怎么办?怎么下载?

我很乐意直接回答这个问题或提供指向正确文档的链接。

【问题讨论】:

    标签: git git-lfs


    【解决方案1】:

    回答 1 正如this video(1:27)中所解释的,当您推送由git lfs 跟踪的文件时,它会被拦截并放置在不同的服务器上,从而在您的 git 存储库中留下一个指针。正如您在问题 4 中提供的参考资料中看到的那样,这对您有用。

    答案 2 这有点棘手。阅读git lfs smudge 的文档,我们有:

    从标准输入读取一个 Git LFS 指针文件并写入内容 对应的大文件到标准输出。如果需要的话, 从 Git LFS 端点下载文件的内容。这 参数(如果提供)仅用于进度条。

    git lfs 端点可以从git lfs env 的输出中找到。我的“端点”是我的存储库下(但不在其中)的一个文件夹,这让我认为 GitLab 在我们的帐户空间中的服务器上创建了一个 git 存储库来存储二进制文件。

    也就是说,我不知道你会如何支持这一点。 GitHub 提供了一个“未处于生产就绪状态”的git lfs server,因此需要您进行一些工作来设置它,以便将二进制文件上传到您管理的服务器。如果备份这些文件是当务之急,并且您不想使用其中一个implementations(Amazon S3 等),您可以尝试使用另一种与 git 一起使用的二进制文件存储系统,例如 git-media、@987654331 @、git-fatgit-bigstore....我没有深入研究这些选项,所以无法提出建议。

    答案 3 如果文件不是使用git lfs 上传的,它将使用git 推送,并且您的 git 存储库中有一个二进制文件。但是,正如您在问题 4 中所说,您的帖子是使用 git lfs 上传的。

    答案 4 您存储库的其他用户在其本地计算机上安装 git lfs 后,只需键入 git lfs pull 即可引入您使用 git lfs 推送的二进制文件。

    【讨论】:

    • 问题1:令人困惑,因为在视频中,文件是在“git push”期间上传的。在我这边,“git push”只需要几分之一秒。似乎没有上传任何东西。 “git lfs push origin master”显然什么也没做。问题 4:“git lfs pull”显示“Git LFS:(2 个文件中的 0 个)0 B / 3.85 GB”,但不执行其他操作。文件未下载。
    • 所以文件没有下载到新的克隆中?那么你的设置可能有问题。关于推送,我不知道该告诉你什么,因为它的工作原理与我在视频中描述的一样。
    • 不是 OP,但 git lfs pull 是我想要的。 :) 谢谢! (git-lfs 的新手)
    • 也是 git-lfs 的新手。 git lfs pull 为我工作。但是现在如果我想将它们转换回指针怎么办? git lfs push 会起作用吗?
    • 对于问题 #4,从 git 版本 2.15.0 开始,常规的 git clone 命令具有 LFS 支持 built-in