我意外地在我的仓库中提交了一个不必要的大子文件夹xxxxx,当我在推动时意识到这一点时,我在中途停止了推送。
然后我使用
从repo中删除了一个不必要的文件夹xxxxxgit rm -r --cached xxxxx
但是虽然ls-files
没有显示xxxxx文件夹,但是当我执行git push
时,git仍在尝试推送它:
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”文件夹及其内容?
答案 0 :(得分:7)
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
制作G'
。我们也重命名旧的(“坏”)master
;事实上,让我们完全删除这个名称,以便我们改为:
E' - F' - G' <-- master
/
A - B - C - D <-- origin/master
\
E - F - G [abandoned]
执行此复制的git命令是git rebase
。通常它只是直接复制;你希望它复制E
,但是然后停下来让你修复F
,然后复制G
,让它做到这一点的方法是使用{{1 }或-i
标志。
一般情况下,你应该只复制那些只有你拥有的提交,但幸运的是这正是--interactive
应该推送的设置,以及你所拥有的任何分支推送,git push
(或任何远程名称,如果它不是origin/branch
)将分隔远程提交的提交(和其他人有)。
交互式rebase可以做的远不止这些,所以请参阅the Git Book获取相关说明。您还需要弄清楚哪些提交包含哪些大文件;为此,origin
和git show
是有用的工具。
答案 1 :(得分:1)
由于提交,需要编辑是在分支的头部,你可能只是修改它就可以逃脱。
git rm <what you need>
然后git commit --amend
这会将更改合并到最近的提交中,而不是创建新的
答案 2 :(得分:0)
为什么不尝试将此文件夹放在git的gitignore文件中。