如何将 Git LFS 文件的旧版本打印到标准输出(git show / git cat-file for LFS)?
How to print a Git LFS file's old version to stdout (git show / git cat-file for LFS)?
这个问题的另一个标题可以是 'How to checkout multiple versions of a Git-LFS managed file?'
我想检查存储在 Git-LFS 中的文件的多个版本。因此,我想在我的工作目录中包含此文件 side-by-side 的多个版本。我的想法是这样的:
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 自己的树中的指针文件。
如何创建未跟踪的 custom-named 文件,每个文件都包含 Git-LFS 跟踪的文件的特定版本?这不需要是单个命令,我已经接受了 Git 需要 multi-step 用于 single-concept 操作的脚本。
当我上次使用 LFS 时,项目页面上有关于更好集成的对话 - 例如通过编写 diff and/or 可以通过 .gitattributes
插入的合并工具。这些似乎没有被认为是高优先级,因为 LFS 的主要预期用例是保护大型 binary 文件(但当然我遇到过多种情况,要么我有一个大文本文件,或者设置 LFS 跟踪规则的唯一合理方法,撒下足够大的网来捕获一些较小的文本文件)。我不确定这些工具是否有任何进展,因为我已经有一段时间没有查看项目页面了。
如果没有这些东西,就没有特别的 "slick" 方法来完成您的要求。您可以设置两个工作树并检查不同的版本。您可以签出一个版本,重命名,然后签出另一个。
更新: 是正确的方法。
这是一个基于对 LFS 存储库进行试验的脚本。我没有详细查看 LFS 协议,因此可能存在无法解释的怪癖,但它适用于我的简单案例。
相关详情如下:
LFS 文件存储在具有以下结构的索引中:
version https://git-lfs.github.com/spec/v1
oid sha256:abcdeffffffffffffff
size nnnnnnnn
实际的 LFS 对象将在 .git/lfs/objects/ab/cd/abcdeffffffffffffff
.
下
将 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
您可以将输出重定向到文件中。
这个问题的另一个标题可以是 'How to checkout multiple versions of a Git-LFS managed file?'
我想检查存储在 Git-LFS 中的文件的多个版本。因此,我想在我的工作目录中包含此文件 side-by-side 的多个版本。我的想法是这样的:
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 自己的树中的指针文件。
如何创建未跟踪的 custom-named 文件,每个文件都包含 Git-LFS 跟踪的文件的特定版本?这不需要是单个命令,我已经接受了 Git 需要 multi-step 用于 single-concept 操作的脚本。
当我上次使用 LFS 时,项目页面上有关于更好集成的对话 - 例如通过编写 diff and/or 可以通过 .gitattributes
插入的合并工具。这些似乎没有被认为是高优先级,因为 LFS 的主要预期用例是保护大型 binary 文件(但当然我遇到过多种情况,要么我有一个大文本文件,或者设置 LFS 跟踪规则的唯一合理方法,撒下足够大的网来捕获一些较小的文本文件)。我不确定这些工具是否有任何进展,因为我已经有一段时间没有查看项目页面了。
如果没有这些东西,就没有特别的 "slick" 方法来完成您的要求。您可以设置两个工作树并检查不同的版本。您可以签出一个版本,重命名,然后签出另一个。
更新:
这是一个基于对 LFS 存储库进行试验的脚本。我没有详细查看 LFS 协议,因此可能存在无法解释的怪癖,但它适用于我的简单案例。
相关详情如下:
LFS 文件存储在具有以下结构的索引中:
version https://git-lfs.github.com/spec/v1 oid sha256:abcdeffffffffffffff size nnnnnnnn
实际的 LFS 对象将在
.git/lfs/objects/ab/cd/abcdeffffffffffffff
. 下
将 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
您可以将输出重定向到文件中。