我已提交ID为56f06019的提交(例如)。在该提交中,我意外地提交了大文件(50Mb)。在另一次提交中,我添加了相同的文件,但大小合适(小)。现在,当我克隆的文件太重时,我的存储库:(如何从存储库历史记录中删除该大文件以减小存储库的大小?
我已提交ID为56f06019的提交(例如)。在该提交中,我意外地提交了大文件(50Mb)。在另一次提交中,我添加了相同的文件,但大小合适(小)。现在,当我克隆的文件太重时,我的存储库:(如何从存储库历史记录中删除该大文件以减小存储库的大小?
Answers:
让我在这里简要概述一下步骤:
git filter-branch --index-filter \
'git rm --cached --ignore-unmatch path/to/mylarge_50mb_file' \
--tag-name-filter cat -- --all
就像前面描述的重新定标选项一样,它filter-branch是重写操作。如果您已发布历史记录,则必须--force推送新的参考。
该filter-branch方法比该rebase方法强大得多,因为它可以
filter-branch 也保留备份,因此除非您使reflog和垃圾回收到期,否则仓库的大小不会立即减小:
rm -Rf .git/refs/original # careful
git gc --aggressive --prune=now # danger
git filter-branch --force --index-filter 'git rm --ignore-unmatch --cached PathTo/MyFile/ToRemove.dll' -- fbf28b005^.. 然后rm --recursive --force .git/refs/original,rm --recursive --force .git/logs 然后我使用git prune --expire now 和git gc --aggressive 这对我来说比上面列出的确切步骤更好。感谢您包含指向Git Pro书籍的链接,因为它非常宝贵。
您可以使用git-extras工具。该泯命令完全从库中删除一个文件,其中包括过去的提交和标签。
您将需要在交互模式下进行git rebase,请参见此处的示例:如何在GitHub上删除提交?以及如何删除旧提交。
如果您的提交为HEAD减去10次提交:
$ git rebase -i HEAD~10
在发布历史记录之后,您需要推送“新”历史记录,需要添加+强制(请参见push选项中的refspec ):
$ git push origin +master
如果其他人已经克隆了您的存储库,您将通知他们,因为您只是更改了历史记录。
git push --force或git push -f(不需要人们知道分支推送的目标)
git rm在路径上使用的原因。
我尝试在Windows https://stackoverflow.com/a/8741530/8461756上使用以下答案
单引号在Windows上不起作用,您需要双引号。
以下对我有用。
git filter-branch --force --index-filter“ git rm --cached --ignore-unmatch PathRelativeRepositoryRoot / bigfile.csv”---all
删除大文件后,我可以将更改推送到github master。