Git推送失败,寻找部分文件历史记录删除。

3
我一直通过使用heroku和git的基本工作流程来更新Facebook应用程序。我是唯一的工作人员,每周都会发生一个新的二进制文件更新。 git commit -am“new update” git push heroku
这个二进制文件已经增长到大约30 MB。最近所有的推送命令都失败了,就像这样: Counting objects: 7, done. Compressing objects: 100% (4/4), done. fatal: sha1 file '' write error: Invalid argument error: failed to push some refs to 'mysecretgitplace'
我在很多地方查找,发现这是一个非常普遍的问题,似乎没有任何特定的原因,可能是任何问题。 现在随着时间的推移,唯一改变的是二进制文件的大小和提交次数的增加,所以很可能只是这个原因。
因此,现在我想尝试减少服务器空间的使用,通过删除/销毁/抹掉这个二进制文件的历史记录(除了当前版本(在服务器上的head/master或其他)之外完全删除)。我会每隔一段时间这样做,除了每周提交二进制文件之外。
有没有一种命令可以让我这样做?(不重新添加整个“已删除”的文件历史记录,一旦我提交了新的二进制文件)
(显然,我只想专注于我的游戏,不想去麻烦服务器和版本控制的事情。)
1个回答

1

Git 允许您通过 过滤 来删除部分历史记录。

在您的情况下,第一个示例应该可以解决问题:git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

然而,您应该非常仔细地阅读有关此命令以及在您的存储库和远程上需要执行哪些操作才能使其生效的说明(特别是,您必须在本地存储库中使用 git gc)。

您可以在 GitHub 帮助部分 中了解更多信息。

顺便说一句,Git 在管理大文件方面并不是很好(可以考虑使用 git annex 作为潜在解决方案)。


1
所以这不是一个好的解决方案。我遇到了一些问题: “fatal: ambiguous argument 'rm': unknown revision or path not in the working tree” 我没有发现任何问题,直到我意识到我正在使用欧洲机器,配有美国101键盘和语言设置。所以这个命令: git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD 应该改成这样: git filter-branch --index-filter "git rm --cached --ignore-unmatch filename" HEAD - user1746223
我一直关注为什么在前两个示例中给出的命令之间存在差异: git filter-branch --tree-filter 'rm filename' HEAD git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD 毫无疑问,这浪费了很多时间。所以,在那个非常简单的修复之后,事实证明当前版本的文件也被删除了。我想我没有清楚地表达,但是保留当前版本非常重要。 - user1746223
1
你的问题是从历史记录中删除一个巨大的文件,我已经回答了。git rm --cached只会删除历史记录中的文件。你仍然可以在你的存储库中找到它作为未跟踪的文件。所以你可以再次添加它。在你的情况下,我会做以下两件事:1)清理存储库并将这个大文件添加到你的gitignore中;2)使用其他方式推送文件或将其存储在其他地方(aws是一个不错的选择)。长期来看,在git文件夹中保留大文件是无法管理的。 - Vincent B.
嗯,如果--cached只删除历史文件而不是当前版本,那么我的应用程序为什么会消失呢?如果它变成了“未跟踪”,我该如何恢复它?我指的只是那个单独的当前版本。 - user1746223
1
首先,你可能已经使用过 git push --force。如果没有,你的文件不可能从服务器上消失。你应该能够像往常一样执行 git add your_filegit commit,以获得文件的当前版本。如果你没有运行过 git gc --prune 或类似的命令,你的文件以及参考它的每个提交,仍然应该在你的 .git/ 文件夹中的某个地方。无论如何,请阅读 https://help.github.com/articles/remove-sensitive-data。里面的所有内容都讲的非常清楚明白。 - Vincent B.
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接