如何将Git LFS文件的旧版本打印到stdout(LFS的git show / git cat-file)?

时间:2018-06-08 12:34:42

标签: git git-lfs

此问题的另一个标题可能是“如何签出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

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

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

3 个答案:

答案 0 :(得分:3)

将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

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

答案 1 :(得分: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下。

答案 2 :(得分:0)

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

如果没有那些东西,那就不是特别的&#34;光滑的&#34;做你要问的方法。您可以设置两个工作树并查看不同的版本。您可以查看一个版本,重命名,然后查看另一个版本。