Can't delete file from the git repository?
我已经向我的Git存储库添加了大于100MB的文件,它在本地Git中工作。不幸的是,GitHub有100 MB的限制。
所以,我重写了代码,使它不需要这个大文件,然后删除它,然后提交。
不幸的是,我仍然不能推到gothub,因为文件仍在存储库中。
我试着跑
1 2 3 4 5 | git rm --cached my_file.dat git rm --cached -r my_file.dat git rm --cached mypath/my_file.dat |
所有命令都失败了
1 | fatal: pathspec ... did not match any files |
号
如何删除没有指定确切路径的文件?
更新
我试着跑
1 | java -jar bfg.jar --strip-blobs-bigger-than 100M |
但它失败了
1 2 | Scanning packfile for large blobs completed in 2 ms. Warning : no large blobs matching criteria found in packfiles - does the repo need to be packed? |
。
但仍然无法
1 | git push origin master |
具有
1 | File my_path/my_file.dat is 257.62 MB; this exceeds GitHub's file size limit of 100.00 MB |
。
顺便提一句,如果您不需要repo中的文件,那么直接删除文件是最简单的选择(尽管如您所见,这并不完全简单)。另一种选择是使用像
所以,回到移除的问题。要提供更多的上下文:好的。
在Git中,有三个位置可以找到文件。好的。
1)工作树-只是你工作的普通文件。
2)索引-这是文件"分段"进行新提交的地方。当你说
3)数据库-这是您的项目历史存在的地方。当你说
现在,正如其他人所指出的,由于您创建了一个包含文件的提交,所以您需要做的不仅仅是
有人说你需要处理"引入"文件的承诺;这是误导。您需要处理对该文件的所有引用(或者从技术上讲,是对表示该文件的
由于
1 | git rebase -i A^ master |
(其中
1 | git rebase -i --root master |
在弹出的TODO列表中,将
此时,由于
上面的过程中有几个重要的假设,如果您最近提交了文件,这些假设可能会保存。但是如果有多个分支可以达到commit
所有这些技巧都改写了历史。因为你不能推动你现有的历史,这可能不是什么大问题(假设你没有第二个遥控器,你已经推动了改变)。好的。好啊。
您需要以某种方式从所有提交中删除此文件。
有几种方法可以做到这一点:
- 如果要编辑的提交数量相当少:使用
git rebase -i 手动编辑提交 - 如果您必须大规模执行(许多提交,几个分支):使用
git filter-branch --index-filter 。或者@sirko建议的bfg-repo-cleaner 。
如何使用git-rebase-i:
如果您的历史记录如下:
1 2 3 | big file added here v --*--A--B--C--D--E--F <- master |
要修改b的内容,需要从其父级重新调整b的基值:
1 | git rebase -i A |
号
这将打开一个文本编辑器,询问您希望对从
它将从以下内容开始:
1 2 3 4 | pick B message pick C message pick D message ... |
您要更改
1 2 3 4 5 | # set the action on b to 'edit' (or e) : e B message pick C message pick D message ... |
。
保存并关闭。
现在Git将应用你告诉他的行动:
- 他会把你的报告倒带到
A 。 - 你让Git编辑
B :他会应用B ,然后停止,这样你就可以随心所欲了。 要从此提交中删除大文件,请执行以下操作:
1
2git rm --cached big/file
git commit --amend现在,您要告诉Git继续重新调整:
1git rebase --continue。
您应该会看到一些消息,指示Git正在重播C,然后是D。F以下
文件仍在存储库的历史记录中…您需要删除引入它的提交…
如果您可以清楚地标识引入它的提交,请尝试以下操作:
1 | git rebase -i ${COMMIT_ID}^ |
。
这将向您提供承诺列表,您可以在其中选择
完成后,再次尝试推动。
Git并不是专为大型二进制文件设计的,因此请避免签入它们。如果您"需要",那么它可能值得签出Git大型文件存储项目。