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

对于要处理此问题的版本控制系统,它需要:

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

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

有帮助吗?

解决方案

对于像 git 和 Mercurial 这样的分布式 SCM 系统,正如 Matthew 提到的那样,不应该成为问题。

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

Mac OS X 捆绑包对比颠覆

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

其他提示

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

这也意味着被替换的目录(例如应用程序或其他捆绑包)仍然会在修订控制下找到具有特定文件名的内容。监视的是文件名,而不是索引节点或类似的东西!

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

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

来自未来的更新:

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

让这个线程回到白天,因为 2013 年 10 月的 iWork(Pages 5.0 等)不再允许存储在“平面文件”(压缩)中,而只能作为捆绑包存储。

问题不在于在此类结构中创建版本控制隐藏文件夹(对于 svn 来说是这样),而是 标记 在问题中说:获得添加或删除的文件的自动、原子更新(由应用程序,在本例中为 iWork),因此我不需要手动执行此操作。

显然,iWork 和苹果只关心 iCloud 的可用性。然而,我有一个在 Mercurial 存储库中存储 .pages、.numbers 和 .keynote 的真实案例。更新后,一切都崩溃了。该怎么办?

附录:

成立 'hg addremove'这对我有用。

$ hg help addremove
hg addremove [OPTION]... [FILE]...

add all new files, delete all missing files
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top