git push试图推送未在git ls-files中列出的文件

时间:2015-12-09 10:03:59

标签: git github

我意外地在我的仓库中提交了一个不必要的大子文件夹xxxxx,当我在推动时意识到这一点时,我在中途停止了推送。

然后我使用

从repo中删除了一个不必要的文件夹xxxxx
git 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”文件夹及其内容?

3 个答案:

答案 0 :(得分:7)

git push不推送文件,它会推送提交。具体来说,它会推送你没有的提交(无论“他们”是谁 - 你正在推动的遥控器)。他们抱怨至少有一个提交包含至少一个大文件。

您需要推送一些不同的提交,以便您推送的提交不包含大文件。

作为一般规则,这样做的方法是保持每个“好”提交完整,将其复制到新分支,并为每个“坏”提交,提取好的部分,删除坏部分,并使结果中的新提交。例如,假设这是远程提交的提交图:

A <- B <- C <- D    <-- origin/master

假设您添加了三个提交,但中间有一个问题:

A - B - C - D       <-- origin/master
             \
              E - F - G   <-- master

当您运行git push时,您的git会发送提交EFG,并且远程抱怨,因为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获取相关说明。您还需要弄清楚哪些提交包含哪些大文件;为此,origingit show是有用的工具。

答案 1 :(得分:1)

由于提交,需要编辑是在分支的头部,你可能只是修改它就可以逃脱。 git rm <what you need>然后git commit --amend

也是如此

这会将更改合并到最近的提交中,而不是创建新的

答案 2 :(得分:0)

为什么不尝试将此文件夹放在git的gitignore文件中。