在git仓库中清理二进制文件

3
我们的git仓库中有一个二进制文件,通常大小为2MB左右。
其中一位开发人员不小心提交了该文件及其所有依赖项,使文件大小增加到约40MB。
当然,我们已经提交了修复版本,但主仓库仍然拥有这个无用的40MB二进制数据块。我可以保证,我们永远不需要该文件的历史记录(对于任何其他提交来说也是如此——它是一个已编译的二进制文件,我们已经对源代码进行了版本控制)。
如何删除该数据块以恢复仓库大小?简单的git gc不足以解决问题,我认为我需要一些我不熟悉的低级别操作。

是的。显然,我们不太关心磁盘空间。但是这个仓库需要部署到远程服务器上。我们不能承受那40MB的开销。 - Yuval Adam
@Yuval,你总是部署整个代码库?为什么?如果你只部署当前版本或使用git pull来部署更改(这意味着只需传输那40MB一次),那不是更好吗? - svick
即便如此,了解这一点仍然很有用——如果能够坚持不懈地这样做,将会使存储库的总体大小保持在较低水平。每增加40MB,总量就会轻松增加几个GB。 - Arafangion
2个回答

5
如果您可以从源代码创建文件,那么它很可能根本不属于仓库。
如果您想从仓库中删除该文件的版本,则最好使用 git rebase -i 进行重新设置仓库。但问题在于,这会重写历史记录,对于已经公开(即共享给多个用户)的提交,您真的不应该这样做。如果您确实想要这样做,请参阅从上游重置中恢复以使其正常工作。
在进行了那次变基之后,该文件将在仓库中保留一段时间,但最终会自动删除。如果您使用 git clonegit pull,则根本不会传输该文件。

我认为另一个答案(及其评论)并没有很清楚地表明这需要重写历史记录。你必须让它看起来好像你从未提交过该文件的那个版本。(我在这里暂且不考虑是否应该提交该文件的判断。) - Cascabel

0

不行,这个文件无法从仓库中删除。 - Yuval Adam
Yuval:你要么想把它从仓库中删除 - 要么不想。做出选择! - Arafangion
(顺便说一句,您可以查看以前的副本。) - Arafangion
@Arafangion - 我想删除特定的二进制数据块,而不是整个文件。是的,这是一种奇怪的低级操作,但我相信在git中是可能的。 - Yuval Adam
2
@Yuval:诀窍在于意识到git并不区分。你的“文件”与那个blob没有任何关联,除了它们共享相同的sha1值。如果你删除对该blob的所有引用,那么从git的角度来看,它就不存在了(不再存在)。如果你更改文件,将会生成一个新的blob。之前的更改将引用之前的blob,而新的更改将引用新的blob。 - Arafangion

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