所以你知道很多 Mac 应用程序都使用“捆绑包”:它看起来像你的应用程序的单个文件,但它实际上是一个包含许多文件的文件夹。
对于一个版本控制系统来处理这个问题,它需要:
- 签出目录中的所有文件,以便应用程序可以根据需要修改它们
- 在办理登机手续时,
- 提交已修改的文件
- 添加应用程序创建的新文件
- 标记为不再存在的已删除文件(因为应用程序删除了它们)
- 将此作为一项原子更改进行管理
关于使用现有版本控制系统处理此问题的最佳方法的任何想法?是否有任何版本控制系统更擅长该领域?
所以你知道很多 Mac 应用程序都使用“捆绑包”:它看起来像你的应用程序的单个文件,但它实际上是一个包含许多文件的文件夹。
对于一个版本控制系统来处理这个问题,它需要:
关于使用现有版本控制系统处理此问题的最佳方法的任何想法?是否有任何版本控制系统更擅长该领域?
Mercurial 在特定版本中基于文件,而不是目录结构。因此,您的工作树是一个成熟的存储库,不会在每个级别都吐出 .svn 文件夹。
这也意味着被替换的目录,如应用程序或其他 Bundle,仍会在修订控制下找到具有特定文件名的内容。文件名被监控,而不是 inode 或任何类似的东西!
显然,如果将新文件添加到 Bundle 中,您需要将其显式添加到您的存储库中。同样,从 Bundle 中删除文件应该使用“hg rm”来完成。
OS X 还没有任何像样的 Mercurial GUI,但如果您所做的只是添加/提交/合并,那么使用命令行并不难。
正如 Matthew 所说,对于像 git 和 mercurial 这样的分布式 SCM 系统应该不是问题。
如果您需要使用像 Subversion 或 CVS 这样的集中式 SCM,那么您可以在将包检入源代码控制之前压缩(归档)您的包。这可能会很痛苦,并且需要额外的步骤。Tapestry Central 上有一篇很好的博客文章:
本文演示了一个为您管理归档的 ruby 脚本。
未来的更新:
如果我记得,在 SVN 中管理捆绑包的问题是每次制作捆绑包时都会清除所有 .svn 文件夹。这应该不再是问题,因为 SVN 将所有内容都存储在根目录下的单个 .svn 文件夹中。
让这个线程回到白天,因为 2013 年 10 月的 iWork(页面 5.0 等)不再允许存储在“平面文件”(压缩)中,而只能作为捆绑包存储。
问题不在于在此类结构中创建版本控制隐藏文件夹(好吧,对于 svn 来说是这样),而是正如Mark在问题中所说:获取添加或删除文件的自动、原子更新(由应用程序,在本例中为 iWork ) 所以我不需要手动执行此操作。
显然,iWork 和 Apple 只对 iCloud 的可用性感到困扰。然而,我有一个真正的案例,可以在 Mercurial 存储库中存储 .pages、.numbers 和 .keynote。更新后,它把一切都炸毁了。该怎么办?
附录:
发现 ' hg addremove
' 这对我有用。
$ hg help addremove
hg addremove [OPTION]... [FILE]...
add all new files, delete all missing files