git - 删除旧 git 提交历史记录中大文件的所有痕迹

标签 git git-commit git-filter-branch git-rewrite-history git-lfs

我正在尝试将一个 Git 项目放在 GitHub 上,但其历史记录包含某些大文件。如果我们尝试 git push 到 GitHub,我们会收到错误:

remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
remote: error: File .OldFiles/blah1/[file].[ext] is 257.29 MB; this exceeds GitHub Enterprise's file size limit of 100.00 MB

我们的第一次提交(例如 commit_1)包含一些大文件,这些文件在后续提交(例如 commit_2)中被删除,而没有重写 git 提交历史记录。

我们正在使用AFS文件系统(可能是额外信息),所有旧的大文件都存储在.OldFiles目录中的特定位置。 在 commit_2 中,我们删除了 .OldFiles 及其内容,并将 blah1 目录添加到 .gitignore 中,但是这并没有删除它们在 Git 中的历史记录。 不幸的是,我们需要在 commit_1commit_2 之后保持其他几个提交的完整性(实际上是 n 次提交!)。

我通过从 commit_1 创建重复分支,在本地沙箱中测试了克隆:

git checkout -b fix_branch <commit_1_sha_id>

发现fix_branch仍然包含大文件:.OldFiles/blah1/[file].[ext]

也许我们需要删除 OldFiles 中的这些大文件及其各自的提交历史记录才能成功进行 GitHub 推送。

尝试过this但我们在 git rebase 中遇到错误:

error: unrecognised input
error: could not build fake ancestor

也尝试过this但失败了:

git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch [project]/.OldFiles/blah1/[file].[ext]' \ --prune-empty --tag-name-filter cat -- --all

我不确定我们是否可以使用 git cherry-pick因为我们不能丢弃 commit_1 中的所有文件,而只能丢弃这些大文件。

是否可以通过重写 git 历史记录并使用 git filter-branch 和 git rebase -i 编辑提交来删除所有大文件跟踪?

附注我们的项目空间中没有安装 lfsbfg

非常感谢这位新手的帮助! :)

最佳答案

BFG确实是专门为这种情况设计的。我确实读过“P.S.我们的项目空间中没有安装 lfs 或 bfg”。你的问题的一部分,但这仍然给你留下了两种可能性:

  • 安装 BFG。如果您的计算机上安装了 Java,则只需下载一个 .jar 文件即可。

  • 使用另一台机器。使用 BFG 是一次性操作,您无需将其安装在常用计算机上,只需访问一台可以运行 BFG 一次的计算机,进行过滤并在任何地方使用生成的存储库即可。

关于git - 删除旧 git 提交历史记录中大文件的所有痕迹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43076857/

相关文章:

部分 merge 的 Git 工作流程?

linux - 致命: could not read Username for 'https://gitlab.com' : No such device or address on gitlab

eclipse - 如何让 Eclipse 识别一个 Git 源代码树,它是一个 Bazaar 源代码树

克隆和子模块更新后 Git 子模块处于 "detached head"状态

git - pull -提交-推还是提交- pull -推?

java - 将提交者/作者添加到 NetBeans 11.0 Bitbucket 提交

git - 将一组给定的文件提取到存储库

git - 代码已从 bitbucket 存储库中消失

git - 旧的 git-commits move 到新的分支

git - filter-branch 删除多余的目录