6

所以你知道很多 Mac 应用程序都使用“捆绑包”:它看起来像你的应用程序的单个文件,但它实际上是一个包含许多文件的文件夹。

对于一个版本控制系统来处理这个问题,它需要:

  • 签出目录中的所有文件,以便应用程序可以根据需要修改它们
  • 在办理登机手续时,
    • 提交已修改的文件
    • 添加应用程序创建的新文件
    • 标记为不再存在的已删除文件(因为应用程序删除了它们)
    • 将此作为一项原子更改进行管理

关于使用现有版本控制系统处理此问题的最佳方法的任何想法?是否有任何版本控制系统更擅长该领域?

4

4 回答 4

2

Mercurial 在特定版本中基于文件,而不是目录结构。因此,您的工作树是一个成熟的存储库,不会在每个级别都吐出 .svn 文件夹。

这也意味着被替换的目录,如应用程序或其他 Bundle,仍会在修订控制下找到具有特定文件名的内容。文件名被监控,而不是 inode 或任何类似的东西!

显然,如果将新文件添加到 Bundle 中,您需要将其显式添加到您的存储库中。同样,从 Bundle 中删除文件应该使用“hg rm”来完成。

OS X 还没有任何像样的 Mercurial GUI,但如果您所做的只是添加/提交/合并,那么使用命令行并不难。

于 2008-08-25T23:30:19.377 回答
1

正如 Matthew 所说,对于像 git 和 mercurial 这样的分布式 SCM 系统应该不是问题。

如果您需要使用像 Subversion 或 CVS 这样的集中式 SCM,那么您可以在将包检入源代码控制之前压缩(归档)您的包。这可能会很痛苦,并且需要额外的步骤。Tapestry Central 上有一篇很好的博客文章:

Mac OS X 捆绑包与 Subversion

本文演示了一个为您管理归档的 ruby​​ 脚本。

于 2008-08-28T14:39:37.337 回答
1

未来的更新:

如果我记得,在 SVN 中管理捆绑包的问题是每次制作捆绑包时都会清除所有 .svn 文件夹。这应该不再是问题,因为 SVN 将所有内容都存储在根目录下的单个 .svn 文件夹中。

于 2013-02-15T21:45:00.780 回答
1

让这个线程回到白天,因为 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
于 2013-11-01T13:21:59.907 回答