【发布时间】:2017-03-28 18:07:29
【问题描述】:
我正在尝试将一个 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 File System(可能是额外信息),所有旧的大文件都存储在.OldFiles 目录中的特定位置。
在commit_2 中,我们删除了.OldFiles 及其内容,并将blah1 目录添加到.gitignore,但这并没有删除它们在Git 中的历史记录。
不幸的是,在commit_1 和commit_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 编辑提交来删除所有大文件跟踪?
附:我们的项目空间中没有安装lfs 或bfg。
非常感谢这位新手的帮助! :)
【问题讨论】:
-
如果分支的布局几乎是线性的,我会回到第一个提交,删除文件,修改它并挑选该分支顶部的任何内容。如果布局更复杂,那么我认为您将不得不使用 filter-branch 来纠正它。
-
这看起来像是 stackoverflow.com/questions/2100907/… 和朋友的副本。
filter-branch操作失败的原因是什么? -
@Edmundo,我不确定
cherry-pick对我们有何帮助。我们已经在commit_1之后进行了几次提交,特别是对于commit_1,我们只需要丢弃大文件并保持其他文件不变。 -
这就是我的意思。如果分支比较 linear,可以这样做:
git checkout commit_1; git rm whateverfile; git commit --amend --no-edit; git cherry-pick commit_1..branch-to-fix;。鉴于在 commit_2(这是第一个被挑选的修订版)上删除了文件并且您已经在修订版中完成了它,您可能会遇到树冲突(虽然不完全确定)。
标签: git git-commit git-filter-branch git-rewrite-history git-lfs