例如,我有一个 ID 为 56f06019
的提交。在那个提交中,我意外地提交了一个大文件(50 MB)。在另一个提交中,我添加了相同的文件,但是大小正确(小)。现在当我克隆我的存储库时,它太重了。如何从存储库历史记录中删除该大文件以减小存储库的大小?
例如,我有一个 ID 为 56f06019
的提交。在那个提交中,我意外地提交了一个大文件(50 MB)。在另一个提交中,我添加了相同的文件,但是大小正确(小)。现在当我克隆我的存储库时,它太重了。如何从存储库历史记录中删除该大文件以减小存储库的大小?
让我在这里简要概述一下步骤:
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
也会保留备份,因此仓库的大小不会立即减小,除非您过期引用日志并进行垃圾回收。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书的链接,它非常有价值。 - dacke.geofilter-branch
之后还有备份是一件好事。 - sehe您可以使用 git-extras 工具。其中的obliterate命令可以完全从存储库中删除一个文件,包括过去的提交和标签。
我尝试在Windows上使用以下答案:https://dev59.com/9moy5IYBdhLWcg3wJKzR#8741530
单引号在Windows上不起作用,需要用双引号。
以下方法适用于我。
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PathRelativeRepositoryRoot/bigfile.csv" -- --all
删除大文件后,我成功将更改推送到GitHub主分支。
.\relative\path\to\file*
对我不起作用。我需要使用 *file*
代替。 - Ooker您需要在交互模式下执行git rebase,可以参考这里的示例:如何在GitHub上删除提交?以及如何删除旧的提交记录。
如果您的提交记录在HEAD减去10个提交之前:
$ git rebase -i HEAD~10
+
以强制执行(请参见push options中的refspec):$ git push origin +master
git push --force
或者git push -f
(这样不需要知道分支推送目标)。 - sehegit rm
的原因。 - Loïc d'Anterroches你可以使用一个简单的命令来删除
git rm -r -f app/unused.txt
git rm -r -f yourfilepath