如何处理Git仓库中的图像?

时间:2011-04-22 14:12:39

标签: git github

我继承了一个中等规模的iOS项目 - 大约30,000行代码 - 具有疯狂数量的图像资源。当然我们使用Git / Github来scm。目前,这些图像都包含在目录树中,因此被摄入到回购中,从中淹没了它,并且通常使开发成为一个令人头痛的问题。

我们在项目上有4个开发人员,有些是虚拟的。我发现将图像移动到Dropbox,从iOS项目中引用它们并保持形状。

有没有人对这个想法发表评论?你做了什么在Git scm设置中处理图像/视频/音频文件?

7 个答案:

答案 0 :(得分:30)

实际上,我对此非常紧张;如果你想更新图像,然后改变主意怎么办?或者,如果您需要使用旧图像构建维护版本,该怎么办?

如果这真的是一个问题 - 而且我从未见过这实际上是一个问题,但我会接受你的意见 - 为什么不只是使用一个回购图像,另一个用于其他一切?然后,您可能只是懒得同步图像。

答案 1 :(得分:15)

处理可能有点痛苦,但我过去使用的是submodules图像和媒体。这样,您可以在不获取图像的情况下仅下载代码,但仍可以使图像和媒体与代码保持同步。当子模块历史变得太大时,我们可以创建一个没有历史记录的新repo,并将旧的子模块替换为新的子模块。这样,人们可以与最新版本的媒体同步,而无需完整的历史记录。

我们经常会在子模块中开始使用视频的绿色屏幕,因此我们可以在视频处于最终形式之前进行开发,但是一旦它被合成,我们就会打破子模块历史并推出新的视频只有合成视频的子模块。这样就避免了每个视频的全部额外副本,同时仍然允许你(通过交换子模块进行一些手动工作)来获取旧版本。

子模块将增加您需要完成的工作量。如果要提交对图像的更改,则需要在子模块中更改它们,提交它,推送它,然后转到父项目,将更改提交到子模块,然后推送它。对于简单的情况,您可以编写一些脚本以使其更容易,但在更复杂的情况下,例如合并冲突,它将比使用单个项目更复杂。

答案 2 :(得分:10)

我自己没有使用它,但是有一个名为git media的项目,旨在使用更好的二进制文件(如git中的图像)更容易。这是来自Scott Chacon,他在git世界中是一件大事,所以我想它可能运作得很好。

答案 3 :(得分:9)

git-lfs似乎是解决此问题的一个很好的现代解决方案。它将文件作为回购中的本地文本指针进行跟踪,同时将它们存储在外部大型文件存储中。这有点像subrepo解决方案,但不需要那么多的人工干预。

一方面,这使您更加依赖于访问互联网 - 如果您无法访问外部文件存储,您可能无法在分支之间切换。另一方面,这意味着当您克隆回购时,您不会下载每个二进制文件的整个历史记录。

GitHubVisual Studio OnlineBitbucket Server支持。

答案 4 :(得分:3)

在处理二进制源时,我发现git是错误的工具。

您的软件需要的最终资产才能被视为“完整”,最好在您的仓库中保留,但我会寻找另一种解决方案来处理实际的图像源,例如ai文件或psd。

Git对使用这些文件几乎没有任何好处,正如你所说,它会使回购膨胀,这会对git提供实际好处的区域产生负面影响。

我自己考虑过dropbox,但我觉得需要一个更加量身定制的解决方案。允许我在计算机之间快速同步,自动存储最近十个版本的一个,允许我保留和命名特定版本并支持锁定文件(阅读:避免需要尝试合并二进制文件。)这是一个不同的工具用于不同的工作/工作流程。可悲的是,我不知道它的存在,但我很乐意看到它的存在。

答案 5 :(得分:1)

我对这个问题很感兴趣。在我的蜿蜒中,我遇到了git附件:http://git-annex.branchable.com Haven没有使用它,因为我的服务器提供商没有安装它。

答案 6 :(得分:0)

您可以使用Subversion系统(SVN)存储图像和二进制文件。图像和其他二进制文件不会经常更改,但是当这些文件集中更改或更新时,您仍然可以收到通知。

Git最适合仅版本化源代码,仅包含Github中的源代码。

Subversion和Git一起可以为你提供所有内容的完整版本。