是否可以使用 `git filter-repo` 从 git 存储库中删除特定版本的文件?

甜甜圈

假设我有一个包含三个提交的小型 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,同时从保持版本aaaacccc

周二

Git-LFS 的使用给原本非常简单的东西增加了一个小问题。

可以“删除” commit bbbb为此,您还必须“删除” commit cccc我在这里将“删除”放在引号中,因为 Git 实际上并没有删除提交。它只是将它们推到一边。它们会在您的存储库中保留一段时间,以便在您确定“删除”它们是一个错误时可以取回它们。

它们保留多久——以及为什么——是一件有点复杂的事情,但默认情况下是将删除的提交保留至少 30 天。同时,删除cccc必须删除的原因bbbb很简单:每次提交都取决于所有先前提交的存在所以你不能只是从链条中间撕下一个。您必须删除那个和所有后续提交

这意味着,要保持内容提交的cccc,你需要做的新的和改善的版本 cccc替换的新鲜度是自动的:现有的提交不能改变,但新的提交总是可以添加的。提交的改进之处在于它包含您想要的快照——无论您选择如何安排——并且它链接回 commit aaaa因此,在查看提交时,Git 现在将从上次提交cccd(或无论其哈希 ID 是什么)开始并查看该提交,然后返回aaaa并查看该提交,您将看到您喜欢的历史记录。

双方git filter-branchgit 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

git filter-repo:可以在特定分支上使用吗?

git filter分支到git filter repo转换

如何使用git从repo中删除大量文件?

不使用bfg从git repo删除密码

是否可以使用Git删除代码注释

如何使用Git Repo文件子集?

在Windows的Git shell中是否可以使用“更多”命令?

被忽略文件夹中的Git命令-是否可以真正忽略它在git repo中?

如何安装git-filter-repo?

更改/删除存储库后,从git repo中删除大文件

无法使用Python从git存储库获取特定文件版本

在filter-branch --tree-filter之后从git repo中删除refs / original / heads / master

如何使用 python 从 git 存储库中获取特定文件版本

git filter repo可以按日期从许多仓库交织的提交中创建一个monorepo吗?

git repo中缺少行

是否可以使用嵌套的 GIT?

是否可以从 git 的存储列表中删除特定的存储?

是否可以使用基本的Unix命令复制(而不是克隆)git存储库?

失去对存储库的访问权限后是否可以使用“git reset hard”?

运行git filter-branch后是否可以检索存储?

通过删除提交从 git repo 历史记录中删除文件是否足够?

是否可以使用Git修改KeePass数据库文件?

检查shell脚本中是否存在git repo

是否可以使用JGit的内存中存储库将一个小文件添加到大的Git存储库而无需在本地检出它?

Git filter-repo-将文件添加到根提交失败

使用 git filter-repo 將子目錄拆分為自己的存儲庫

如何使用 gitpython 查询特定 git repo 分支的日志?

Repo (GIT) 如何在使用镜像时更新清单文件?

将git repo存储在数据库中