如何将Git LFS文件的旧版本打印到标准输出(使用git show / git cat-file获取LFS)?

10

这个问题的另一个标题可以是“如何检出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个回答

6
将lfs指针传输到git lfs smudge将会得到你想要的结果。例如:
git cat-file blob <blob-sha> | git lfs smudge

如果你有一个提交哈希、分支名、HEAD等信息以及一个文件名:

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

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


@Koterpillar 如果sha是tree-ish的sha,则“:<file>”部分是必需的。如果它是blob本身的sha,则只有这个。 - markonius

4

更新: @Markonius的答案 是正确的方法。

以下是一个脚本,它基于对LFS存储库进行实验。我没有详细查看LFS协议,因此可能存在未考虑到的问题,但对于我的简单情况有效。

git-lfs-cat-file

相关细节如下:

  • LFS files are stored in the index with the following structure:

    version https://git-lfs.github.com/spec/v1
    oid sha256:abcdeffffffffffffff
    size nnnnnnnn
    
  • Actual LFS object will then be under .git/lfs/objects/ab/cd/abcdeffffffffffffff.


0

上次我在使用LFS时,项目页面上有关于更好的集成的讨论 - 比如编写可以通过.gitattributes插入的差异和/或合并工具。这些似乎不被视为高优先级,因为LFS的主要预期用例是保护大型二进制文件(但我肯定遇到过多种情况,其中要么我有一个大型文本文件,要么设置LFS跟踪规则的唯一合理方法是投放足够宽泛的网)。我不确定这些工具是否有任何进展,因为我已经有一段时间没有查看项目页面了。

如果没有这些工具,就没有特别“流畅”的方法来完成您所要求的操作。您可以设置两个工作树并检出不同版本。您可以检出一个版本,重命名它,然后检出另一个版本。


1
将二进制文件打印到标准输出确实不太美观。但这对我来说并不重要,因为我打算将stdout重定向到文件中。git show也会将文本和二进制文件流式传输到stdout,并将重定向留给用户。(此外,Jupyter笔记本包含base64编码的图像,可能会变得非常大。)感谢您在Git-LFS讨论中的建议,以及感谢您的回答;检出和重命名操作看起来很适合我的目的。 - Esteis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接