我在一家公司工作,我们在那里创建了许多针对客户的小型应用程序。我们是少数开发人员,但大多数时候每个项目只有一名开发人员。
Customer1
ProjectX
App
Tests
ProjectY
App
Tests
Customer2
Project2
Products
Product1
Common
今天,所有内容都存储在一个存储库中。
过程很简单。
- 开发人员为客户承担了一个新项目
- 为项目创建一个新文件夹
- 新项目中的代码
- 在另一个项目中进行一些维护
- 签入维护项目的更新
- 新项目中的更多工作
- 签入新项目
- 交付给客户
没有标记也没有分支。早期版本根据日期签出。
这个过程多年来一直运行良好,但当前工具 (CVS) 存在一些痛点
- 慢的。即使没有任何变化,结帐也需要几分钟。历史记录存储在服务器上,因此差异需要很长时间
- 添加新项目。如果你使用过 CVS,你知道它就像:添加文件夹,在文件夹中添加文件,添加下一个文件夹......
- 无法消除明显的错误(检查二进制文件等)
- 不支持重命名,这使得必要的重构更加痛苦。
我私下使用 Mercurial 已经有一段时间了,并希望将其扩展到所有开发人员。
我可能完全搞错了,但有些事情我不明白如何在我们的组织中实施。
CVS 提交只是当前文件夹,但在 mercurial 中,它们是存储库范围内的。在我们的例子中,这意味着在一个文件夹中提交维护工作也会在另一个文件夹中提交尚未完成的内容。(我假设我们可以hg ci ./**
在更改的文件夹中执行此操作,但合并时不允许这样做,至少文档是这么说的If you are committing the result of a merge, do not provide any filenames or -I/-X filters.
)
Mercurial 中的常见做法是每个项目有一个存储库。
每个项目一个存储库对我们来说是可以的,但它会产生一些其他问题,例如:
如何管理中央服务器上的多个存储库?
如果开发人员创建了一个新项目,他最终需要推送他的更改。只是在做
hg push http://localhost:8000/Customer1/NewProject
使用丑陋的堆栈转储使 hg-webserver 崩溃并挂起客户端。
我理解的方式是开发人员需要访问服务器外壳才能将新存储库添加到配置文件并重新启动 hgweb
另一种方法是使用 SSH 或共享(使用 SSH 代替文件共享有什么好处吗?)
cd Customer\NewProject
hg init
hg clone --noupdate --pull . //mercurialshare\Customer\Project
echo "[paths]" >.hg\hgrc
echo "default=//mercurialshare\Customer\Project" >>.hg\hgrc
hg push
有效,但对某些开发人员来说有点复杂
所有开发人员都需要拥有所有项目。
(并非所有项目都是链接的,因此它们需要存在,并且最容易拥有所有项目)
随着每周添加许多现有项目和新项目,我们需要一种方法来一次性提取所有项目并克隆新项目。
我在想 subrepos 可以解决“全局”拉,但文档中的以下行是一个展示者
“当我们提交时,Mercurial 将尝试创建整个项目及其子存储库状态的一致快照。它首先尝试提交所有修改的子存储库,然后记录所有子存储库的状态。”
回到全局提交的单一仓库问题。
(尝试了一些变体,hg ci .hgsub .hgsubstate <subrepo>
但 .hgsubstate 似乎只在完整提交时更新。其他用户hg pull --update
在项目文件夹中没有明确的情况下将看不到项目更改)
我目前的想法是在根目录中有一个批处理文件来拉取所有项目
关于如何在我们的组织中使用 mercurial 的任何其他想法?
编辑
谢谢回复。我目前正在评估每个项目的一个存储库如何为我们工作。我把一个批处理文件放在顶层
FOR /F %%x IN (repolist.txt) DO (
If EXIST .\%%x\.hg (
ECHO Pull %%x
hg pull --update --repository .\%%x
) ELSE (
ECHO Clone %%x
mkdir .\%%x
hg clone --pull %1\%%x .\%%x
)
)