50

有没有什么好的方法可以使用诸如hggit之类的 DVCS 工具来处理大型资产(即 1000 张图像、flash 电影等) 。正如我所看到的,克隆充满 4 GB 资产的存储库似乎是不必要的开销,因为您将检查文件。如果您将源代码与资产文件混合在一起,这似乎相当麻烦。

有没有人在 Web 开发环境中这样做有任何想法或经验?

4

5 回答 5

39

这些是我对这个主题的一些想法。最后,您可能需要将资产和代码尽可能分开。我可以想到几种可能的策略:

分布式,两个存储库

一个存储库中的资产和另一个存储库中的代码。

优点

  • 在 Web 开发环境中,如果您不直接使用图形文件,则不需要克隆巨大的资产存储库。如果您有一个处理与动态内容(PHP、ASP.NET、RoR 等)分开的资产并与资产存储库同步的 Web 服务器,则这是可能的。

缺点

  • DVCS 工具不会跟踪除了自己的存储库之外的其他存储库,因此没有任何直接的 BOM(材料清单)支持,即没有明确的方法来判断两个存储库何时同步。(我想这就是git-submodulerepo的用途)。

    示例:艺术家在一个存储库中添加了一张新图片,程序员添加了使用图片的功能,但是当有人必须回溯版本时,他们被迫以某种方式自行跟踪这些更改。

  • 资产存储库开销,即使它只影响使用它的人。

分布式,一个存储库

资产和代码位于同一个存储库中,但它们位于两个单独的目录中。

优点

  • 代码和资产的版本控制是相互交织的,因此 BOM 是实用的。回溯是可能的,没有太多麻烦。

缺点

  • 由于分布式版本控制工具会跟踪整个项目结构,因此通常无法只检查一个目录。
  • 您仍然有存储库开销的问题。更重要的是,您需要检查资产和代码。

上面列出的两种策略仍然存在开销较大的缺点,因为您需要克隆大型资产存储库。这个问题的一个解决方案是上面第一个策略的变体,两个存储库;将代码保存在分布式 VCS 存储库中,将资产保存在集中式 VCS 存储库中(例如 SVN、Alienbrain 等)。

考虑到大多数图形设计师如何使用二进制文件,通常不需要分支,除非确实有必要(新功能需要大量资产,直到很久以后才需要)。缺点是您需要找到一种方法来备份中央存储库。因此,第三种策略:

存储库外资产(或 CMS 中的资产)

存储库中的代码照常,资产不在存储库中。资产应该放在某种内容/媒体/资产管理系统中,或者至少放在定期备份的文件夹中。这假设很少需要回溯带有图形的版本。如果需要回溯,则图形更改可以忽略不计。

优点

  • 不会使代码存储库膨胀(对例如 git 很有帮助,因为它经常进行文件检查)
  • 支持灵活处理资产,例如将资产部署到仅用于资产的服务器
  • 如果在带有 API 的 CMS 上,资产应该在代码中相对容易处理

缺点

  • 不支持 BOM
  • 没有简单的广泛版本回溯支持,这取决于您的资产的备份策略
于 2009-08-16T18:28:29.563 回答
3

想法,没有经验:我确实会将代码与数据分开。假设有一组属于应用程序的图像,我会将其保存在中央服务器上。在代码中,我会安排(通过显式编码)应用程序可以集成本地或远程资产。然后,贡献者可以首先将新图像放在他们的本地存储中,并在需要和批准时将其与某种(显式)上传程序集成到中央存储中。

于 2009-08-16T16:53:55.063 回答
2

我自己也为此苦苦挣扎。正如您所说,对 GB 的资产进行版本控制可能是一个巨大的痛苦。

对于需要外部参与的项目,我发现 Mercurial 是一个可行的解决方案,但不是一个很好的解决方案。它会占用大文件的磁盘空间,并且根据情况可能会相当慢。

对于我的内部设计工作,我更喜欢使用简单的同步工具(rsync、synctoy 等)来使服务器/机器之间的目录保持最新,然后手动进行版本控制。我发现我很少需要对主要修订之外的任何内容进行版本控制。

于 2009-08-16T19:21:00.980 回答
1

也许应该在这种情况下提到 GIT LFS(另请参阅Atlassian 的 git lfs 教程

于 2020-12-01T13:43:18.280 回答
0

在游戏开发行业(拥有庞大的存储库)中,一种相当流行的选择是使用 Plastic SCM。

他们可以选择将 blob 存储在文件系统而不是数据库中。

https://www.plasticscm.com

于 2019-11-01T20:38:18.517 回答