DVCS(Mercurial)不适合我吗?

adr*_*anm 6 mercurial dvcs subrepos

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

Customer1
    ProjectX
        App
        Tests
    ProjectY
        App
        Tests
Customer2
    Project2
Products
    Product1
Common
Run Code Online (Sandbox Code Playgroud)

今天,一切都存储在一个存储库中.

这个过程很简单.

  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并挂起客户端.

我理解的方式是开发人员需要访问服务器shell以将新存储库添加到配置文件并重新启动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
Run Code Online (Sandbox Code Playgroud)

可行,但对于一些开发人员来说有点复杂

所有开发人员都需要拥有所有项目.
(实际上并非所有项目都链接在一起,所以它们需要存在,而且最简单的就是拥有所有项目)

随着许多现有项目和每周增加的新项目,我们需要一种方法来一次性拉动所有项目并克隆新项目.

我认为subrepos可以解决"全局"拉动,但文档中的以下行是一个showstopper

"当我们提交时,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
    )
)
Run Code Online (Sandbox Code Playgroud)

Pau*_*l S 8

您有权说Mercurial是针对每个回购项目设计的.当你这样工作时,它也会更好,因为不同项目的历史是分开的.

试图在DVCS回购中拥有多个项目会导致痛苦.

我个人更喜欢通过SSH而不是HTTP服务项目.一个原因是能够......

# hg init blah
# hg clone blah ssh://server/blah
Run Code Online (Sandbox Code Playgroud)

如果您通过HTTP提供服务,则无效(正如您所知).我很惊讶它导致了严重的崩溃: - /

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

不是你真正想要的.

可能,常见的东西应该是需要它的项目的子回购.然后,每个项目可能会冻结在相同代码的不同版本上,并且您没有遇到任何问题.这需要一点思考.

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