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

问题描述 投票:3回答:3

这个问题的另一个标题可能是“如何签出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需要多步骤脚本来进行单一概念操作。

git git-lfs
3个回答
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

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


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下。

0
投票

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

没有这些东西,没有一种特别“光滑”的方式来做你所要求的。您可以设置两个工作树并查看不同的版本。您可以查看一个版本,重命名,然后查看另一个版本。

© www.soinside.com 2019 - 2024. All rights reserved.