Git计算太多文件并尝试推送未跟踪的文件

时间:2017-05-31 12:46:26

标签: git github command-line

我和git和guthub相对不高兴。我遇到了一个阻止我将文件上传到github的问题。

完成后

git add .
git commit -m "update"
git push origin master

控制台然后说

Counting objects: 5439, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3670/3670), done.
^Citing objects:   5% (320/5439), 31.90 MiB | 3.54 MiB/s    
Total 5439 (delta 1392), reused 5438 (delta 1391)
remote: Resolving deltas: 100% (1392/1392), completed with 1 local object.
remote: error: GH001: Large files detected. You may want to try Git Large 
File Storage - https://git-lfs.github.com.
remote: error: Trace: 5dd2ad6c7e223707ec5baf451b28c2f0
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File ImmerGo_24x2/ImmerGo node server + 
client/nwjs.app/Contents/Versions/56.0.2924.87/nwjs Framework.framework/nwjs 
Framework is 101.72 MB; this exceeds GitHub's file size limit of 100.00 MB

5439是太多的文件,似乎它试图上传我的nw.app,即使我没有留下这个。我还在我的.gitignore中加入了它的路径。

运行这些

之后
git ls-files
git ls-files --others

它似乎正在跟踪我的仓库的正确文件,因此我不确定如何阻止客户端/ nwjs.app被上传。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

描述问题

此:

Counting objects: 5439, done.

对象的计数,而不是文件。 Git有四种对象:提交,树,blob(松散的“文件”)和(带注释的)标记。所以这意味着你告诉你的Git发送给他们(GitHub的)Git的对象集中有5439个commits-plus-trees-plus-blobs-plus-tags。

git ls-files

ls-files命令显示存储在索引中的文件(blob对象)。索引不是提交(但提交有关:它是您的Git构建下一次提交的地方)。

当你运行git push时,你会指示你的Git调用另一个Git。他们根据你提供的 refspec 参数,协商你的Git应该发送给他们的Git的“顶级对象”(提交和/或标记):

git push remote refspec1 refspec2 ... refspecN

在你的情况下,远程origin(即GitHub的Git),单个refspec是master。因此,您的Git会查看您的master标识的提交以及 master标识的提交。你的Git会找到你拥有的所有提交,而不是它们。

这几乎肯定是两个提交,可能还有更多。

然后你的Git打包所有这些提交,以及那些提交使用的所有其他对象 - 树和blob,他们的Git还没有。这就是5439对象计数的来源。在您发送的集合中有足够的提交,树和blob,以添加到那么多对象。

一旦他们的Git收到了所有这些对象,他们的Git解压缩它们(通过预接收或更新钩子,毫无疑问)检查它们。其中一个提交有一个大文件。然后他们的Git会在打印出您看到的错误消息后拒绝更新master的请求(在打印之前,您的Git会在每行前加上单词remote:)。

解决问题

您需要推送不同(可能更少和/或更好)的提交。

要做到这一点,你需要 - 好吧,“想要” - 让你的master指向新的,不同的提交。然后你可以放弃旧的(和丑陋的?)提交,或者将它们放在你从未推送到GitHub的分支上。是保留还是放弃它取决于你。

有很多方法可以实现这一目标,而我现在没有多少时间再次写这些内容了。查找 rebasing 和“BFG”。根据您是否要使用BFG(据报道它更简单),您也可以使用git filter-branch,但这很复杂。如果你有一个简单的案例 - 你不可能知道你在这里发布了什么 - 一个简单的git rebase -i origin/master并将大文件的意外提交删除提交到squash es就足够了。