假设我有一个包含三个提交的小型 Git 存储库:
commit cccc:
updated smile.png (LFS)
updated manual.md
commit bbbb:
updated smile.png (LFS) <==== Don't want this specific one anymore!
added manual.md
commit aaaa:
added smile.png (LFS)
added README.md
added .gitattributes
我已经添加了 3 个不同版本的 LFS 文件smile.png
,但我已经确定我不想或不需要中间版本再存在于我的存储库中。我不介意改变 git 历史。我还想缩小存储库的整体大小。
我知道这git filter-repo --path smile.png --invert-paths
可用于完全删除smile.png
. 但是,有没有办法删除特定版本的承诺bbbb
,同时从保持版本aaaa
和cccc
?
Git-LFS 的使用给原本非常简单的东西增加了一个小问题。
您可以“删除” commit bbbb
。为此,您还必须“删除” commit cccc
。我在这里将“删除”放在引号中,因为 Git 实际上并没有删除提交。它只是将它们推到一边。它们会在您的存储库中保留一段时间,以便在您确定“删除”它们是一个错误时可以取回它们。
它们保留多久——以及为什么——是一件有点复杂的事情,但默认情况下是将删除的提交保留至少 30 天。同时,删除cccc
时必须删除的原因bbbb
很简单:每次提交都取决于所有先前提交的存在。所以你不能只是从链条中间撕下一个。您必须删除那个和所有后续提交。
这意味着,要保持内容提交的cccc
,你需要做的新的和改善的版本 cccc
。替换的新鲜度是自动的:现有的提交不能改变,但新的提交总是可以添加的。提交的改进之处在于它包含您想要的快照——无论您选择如何安排——并且它链接回 commit aaaa
。因此,在查看提交时,Git 现在将从上次提交cccd
(或无论其哈希 ID 是什么)开始并查看该提交,然后返回aaaa
并查看该提交,您将看到您喜欢的历史记录。
双方git filter-branch
并git filter-repo
可以很容易地做这种手术。还有其他方法可以做同样的手术;在这种特殊情况下,只需复制一次提交,我们就可以使用git commit-tree
(制作新的和改进的cccd
)和git reset
(将分支名称移动到find cccd
)来完成。git replace
在此处查看有关许多选项(、提交树方法、BFG、过滤器分支、过滤器存储库等)的编辑历史记录的许多 StackOverflow 问题中的任何一个。
以下是有关使用 Git-LFS 的知识:当您在 Git-LFS 中添加并提交“大文件”时,LFS 软件已秘密地将您的文件替换为“LFS 指针文件”(该文件很小:通常在1 KB)。这意味着Git根本不存储您的文件。Git 存储这个 LFS 指针文件。LFS 代码已经将您的文件存储在其他地方(在某个其他网站上),1并使用指针文件来查找存储的文件。当您让 Git 检出某个特定提交时,Git-LFS 软件会拦截检出,注意到某些文件已被秘密替换为指针,然后前往 LFS 网站检索大文件。
当你做你的历史改写,你会成为一个新的提交cccd
具有完全相同的内容的cccc
。这很好,因为指针文件 incccd
将是来自cccc
. 所以 LFS 拦截器会用相同的更大的文件替换它。但是:commitbbbb
包含一个指向存储在另一个网站上的某个文件的指针文件,其中保存了大文件。另一个网站不知道您永远不会bbbb
再次提及提交。2所以他们要保留大文件。
如果你想让他们摆脱bbbb
大文件的 for-版本,你需要一些其他的机制——一种完全在 Git 本身之外的机制——来摆脱它。这不是 Git 的任何部分都会做的事情。请注意,如果您专门使用 GitHub,您可能会在这里遇到一些问题:如何删除 git-lfs 跟踪的文件并释放存储配额?
1这个“独立网站”可以是主托管服务提供商的网站,也可以是次要站点,或者与某些托管服务提供商的网站完全分开。详细信息取决于您和您的 LFS 配置。
2假设,也就是说,您不改变主意并恢复commit bbbb
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句