我意外地在我的仓库中提交了一个不必要的大型子文件夹xxxxx,当我在推动时意识到这一点时,我在中途停止了推动.
然后我从repo中删除了一个不必要的文件夹xxxxx
git rm -r --cached xxxxx
但是虽然ls-files
没有显示xxxxx文件夹,但是当我执行时,git仍然试图推送它git push
:
git push --verbose (...) Counting objects: 19, done. Delta compression using up to 8 threads. Compressing objects: 100% (18/18), done. POST git-receive-pack (chunked) Writing objects: 100% (19/19), 132.93 MiB | 197.00 KiB/s, done. Total 19 (delta 5), reused 0 (delta 0) remote: warning: File xxxxx/a.csv is 72.22 MB; this is larger than GitHub Enterprise's recommended maximum file size of 50.00 MB remote: error: GH001: Large files detected. remote: error: File xxxxx/b is 112.37 MB; this exceeds GitHub Enterprise's file size limit of 100.00 MB
如何让git永久忘记"xxxxx"文件夹及其内容?
git push
不推送文件,它推送提交.具体来说,它会推送你没有的提交(无论"他们"是谁 - 你正在推动的遥控器).他们抱怨至少有一个提交包含至少一个大文件.
您需要推送一些不同的提交,以便您推送的提交不包含大文件.
作为一般规则,执行此操作的方法是使每个"好"提交保持不变,将其复制到新分支,并为每个"坏"提交,提取好的部分,删除坏部分,并进行新的提交出于结果.例如,假设这是远程提交的提交图:
A <- B <- C <- D <-- origin/master
假设您已添加了三个提交,但中间有一个问题:
A - B - C - D <-- origin/master \ E - F - G <-- master
当你运行git push
你的git发送提交E
,F
和,并且G
,并且远程抱怨因为F
有文件它不应该.要解决此问题,您只需复制E
到新分支 - 我们将调用副本E'
- 然后复制 - 但是修复F
生成F'
,然后复制G
到make G'
.让我们重命名旧("坏")master
; 事实上,让我们完全删除名称,以便我们改为:
E' - F' - G' <-- master / A - B - C - D <-- origin/master \ E - F - G [abandoned]
执行此复制的git命令是git rebase
.通常它只是直接复制; 你希望它复制E
,但然后停止并让你修复F
,然后复制G
,并让它做到这一点的方法是使用-i
或--interactive
标志.
在一般情况下,你应该只复制而变化的承诺是只有你有,幸好这正是设定git push
应该推,不管分支你推,(或任何远程名称,如果它不)会分隔遥控器(和其他人拥有)的提交.origin/branch
origin
交互式rebase可以做的远不止这些,所以请参阅Git Book获取说明.您还需要弄清楚哪些提交包含哪些大文件; 为此,git show
并且git diff
是有用的工具.