6

我在一家公司工作,我们在那里创建了许多针对客户的小型应用程序。我们是少数开发人员,但大多数时候每个项目只有一名开发人员。

Customer1
    ProjectX
        App
        Tests
    ProjectY
        App
        Tests
Customer2
    Project2
Products
    Product1
Common

今天,所有内容都存储在一个存储库中。

过程很简单。

  1. 开发人员为客户承担了一个新项目
  2. 为项目创建一个新文件夹
  3. 新项目中的代码
  4. 在另一个项目中进行一些维护
  5. 签入维护项目的更新
  6. 新项目中的更多工作
  7. 签入新项目
  8. 交付给客户

没有标记也没有分支。早期版本根据日期签出。

这个过程多年来一直运行良好,但当前工具 (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
    )
)
4

1 回答 1

8

您有权说 Mercurial 是为每个 repo 一个项目而设计的。当你这样工作时,它也会好很多,因为不同项目的历史是分开的。

尝试在 DVCS 存储库中拥有多个项目只会导致痛苦。

就个人而言,我更喜欢通过 SSH 而不是 HTTP 服务项目。一个原因是能力...

# hg init blah
# hg clone blah ssh://server/blah

如果您通过 HTTP 提供服务,这将不起作用(正如您所发现的那样)。我很惊讶它会导致严重崩溃:-/

获取所有项目的 sub-repos 方法并不像你描述的那样。不是你回到全局提交(项目可以单独开发),而是超级项目存储了它所依赖的子项目的版本。如果您有(例如)一个库作为子项目,这正是您想要的,但发布取决于特定版本。实际上,子存储库链接是指向特定版本的另一个存储库的书签。

虽然不是你所追求的。

可能,通用的东西应该是需要它的项目的子存储库。然后,每个项目可能会被冻结在相同代码的不同版本上,而您没有遇到任何问题。这需要一点思考。

否则脚本的想法可能是最简单的。

于 2010-11-08T00:21:21.593 回答