我一直在谷歌上搜索,所以一直在寻找提出这个问题的人,但现在完全是空的。我会提前为提问的冗长迂回方式道歉。(如果我能够弄清楚如何封装问题,也许我会成功地找到答案。)
当构建/编译行为生成数百个临时文件以创建最终结果时,如何在 Mercurial 中管理大型项目? 是唯一.hgignore
的答案吗?
示例场景:
您有一个项目想要使用一些开源包来实现某些功能,并且需要从源代码编译。所以你去拿包裹。un-.tgz 然后将其放入自己的 Mercurial 存储库中,这样您就可以开始跟踪更改。然后您进行所有更改,并运行构建。
您测试您的最终结果,对结果感到满意,并准备好提交回您的本地存储库克隆。因此,您hg status
在提交之前检查您的更改hg status
结果导致您立即开始使用所有那些会让您的母亲感到羞耻的词 - 因为您现在有“构建垃圾”的屏幕和屏幕。
为了争论起见,说这个包是 MySQL 或 Apache:
- 你无法控制并且会定期改变,
- 在很多地方留下很多垃圾,并且
- 不能保证每次从外部来源获得新版本时,cruft 都不会改变。
哇什么?引起这种焦虑的特定项目将由多个开发人员在多个物理位置进行,因此需要尽可能简单。如果涉及太多,他们就不会这样做,我们将面临更大的问题。(可悲的是,一些老狗并不热衷于学习新技巧......)
一个提议的解决方案是,他们只需要在制作之前在本地提交所有内容,因此他们有一个“干净的石板”,然后他们必须从中克隆才能实际进行构建。这被击落为(a)太多步骤,以及 (b) 不想用一堆“现在就构建”变更集来破坏历史。
其他人建议将所有杂物都提交到 Mercurial 存储库中。我强烈反对,因为下次这些文件将显示为“已修改”,因此会包含在变更集的文件列表中。
我们不可能是唯一遇到这个问题的人。那么什么是“正确”的解决方案?是我们尝试创建大规模智能.hginore
文件的唯一途径吗?这让我感到不安,因为如果我告诉 Mercurial“忽略此目录中我尚未告诉您的所有内容”,那么如果下一个应用的补丁将文件添加到该被忽略的目录中会发生什么?(Mercurial 永远不会看到那个新文件,对吧?)
希望这不是一个带有明显答案的完全愚蠢的问题。我以前从源代码编译过很多次,但从来不需要在此之上应用版本控制。另外,我们是 Mercurial 的新手。