例如,我有一个 ID 为 56f06019的提交。在那次提交中,我意外地提交了大文件(50MB)。在另一个提交中,我添加了相同的文件,但是大小合适(很小)。现在我克隆的时候回收的东西太重了。如何从回购历史中删除该大文件,以减少我的回购的大小?
56f06019
您将需要 Git rebase在交互模式下看到这里的一个例子: 如何删除对 GitHub 的提交?和 如何删除旧提交。
如果你的提交是在 HEAD-10提交:
$ git rebase -i HEAD~10
在完成历史版本之后,您需要推送“新”历史,您需要添加 +来强制执行(请参阅 推送选项中的 refspec) :
+
$ git push origin +master
如果其他人已经克隆了您的存储库,您将通知他们,因为您刚刚更改了历史记录。
专业饭桶书的第9章有一个关于 移除对象的章节。
让我在这里简要地概述一下步骤:
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
--force
filter-branch方法比 rebase方法强大得多,因为它
rebase
filter-branch也保留备份,所以回购的大小不会立即减少,除非你过期的重写和垃圾回收:
rm -Rf .git/refs/original # careful git gc --aggressive --prune=now # danger
您可以使用 git-extras工具。 抹去命令从存储库中完全删除一个文件,包括过去的提交和标记。
Https://github.com/tj/git-extras/blob/master/commands.md
我尝试在窗口上使用以下答案 Https://stackoverflow.com/a/8741530/8461756
单引号在窗口上不起作用; 您需要双引号。
跟踪对我很管用。
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PathRelativeRepositoryRoot/bigfile.csv" -- --all
删除大文件后,我可以将更改推送到 GitHub 主服务器。
您可以使用一个简单的命令来删除
git rm -r -f app/unused.txt git rm -r -f yourfilepath