【问题标题】:How to print a Git LFS file's old version to stdout (git show / git cat-file for LFS)?如何将 Git LFS 文件的旧版本打印到标准输出(git show / git cat-file for LFS)?
【发布时间】:2019-04-18 06:50:00
【问题描述】:

此问题的另一个标题可能是“如何签出 Git-LFS 托管文件的多个版本?”

我想检查存储在 Git-LFS 中的文件的多个版本。因此,我想在我的工作目录中并排放置该文件的多个版本。我的想法是这样的:

git show v1:./myfile.ipynb > myfile-v1.ipynb
git show v2:./myfile.ipynb > myfile-v2.ipynb

这不能按预期工作:该文件由 Git-LFS 管理,因此 git show 每个版本的内容看起来像

version https://git-lfs.github.com/spec/v1
oid sha256:62aafe00ec8b61a37dd729e7d3a723382...
size 20439

我对文件的“真实”、Git-LFS 管理的内容感兴趣,而不是 LFS 存储在 Git 自己的树中的指针文件。

如何创建未跟踪的自定义命名文件,每个文件都包含 Git-LFS 跟踪的文件的特定版本?这不需要是一个命令,我已经辞职到 Git 需要多步骤脚本来执行单一概念操作。

【问题讨论】:

    标签: git git-lfs


    【解决方案1】:

    将 lfs 指针插入git lfs smudge 会得到你想要的。例如:

    git cat-file blob <blob-sha> | git lfs smudge
    

    或者,如果您有一个 commit-ish(一个提交哈希、分支名称、只是 HEAD 等)和一个文件名:

    git cat-file blob <commit-ish>:path/to/my-large-file.name | git lfs smudge
    

    您可以将输出重定向到文件中。

    【讨论】:

    • @Koterpillar :&lt;file&gt; 部分仅在 sha 是树形的 sha 时才是必需的。如果它本身就是一个 blob 的 sha,那么就是这样。
    【解决方案2】:

    更新@Markonius' answer 是正确的做法。

    这是一个基于 LFS 存储库试验的脚本。我没有详细查看 LFS 协议,因此可能存在无法解释的怪癖,但它适用于我的简单案例。

    git-lfs-cat-file

    相关详情如下:

    • LFS 文件存储在索引中,结构如下:

      version https://git-lfs.github.com/spec/v1
      oid sha256:abcdeffffffffffffff
      size nnnnnnnn
      
    • 然后,实际的 LFS 对象将位于 .git/lfs/objects/ab/cd/abcdeffffffffffffff 下。

    【讨论】:

      【解决方案3】:

      当我上次使用 LFS 时,项目页面上有关于更好集成的对话 - 例如通过编写可以通过 .gitattributes 插入的差异和/或合并工具。这些似乎没有被认为是高优先级,因为 LFS 的主要预期用例是保护大型 binary 文件(但当然我遇到过多种情况,其中要么我有一个大文本文件, 或者设置 LFS 跟踪规则的唯一合理方法是撒下足够大的网来捕获一些较小的文本文件)。我不确定这些工具是否有任何进展,因为我有一段时间没有查看项目页面了。

      如果没有这些东西,就没有一种特别“巧妙”的方式来做你所要求的事情。您可以设置两个工作树并检查不同的版本。您可以签出一个版本,重命名它,然后再签出另一个。

      【讨论】:

      • 将二进制文件打印到标准输出确实没有吸引力。这对我来说并不重要,因为我打算将该标准输出重定向到一个文件中。 git show 也将文本和二进制文件流式传输到标准输出,并将重定向留给用户。 (此外,Jupyter 笔记本包含 base64 编码的图像,可能会变得非常大。)感谢您就 Git-LFS 讨论提供建议,并感谢您的回答;结帐和重命名的舞蹈看起来很适合我的目的。
      猜你喜欢
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 2023-02-13
      • 2020-11-29
      • 2020-08-06
      相关资源
      最近更新 更多