代码之家  ›  专栏  ›  技术社区  ›  adrianm

DVCS不适合我吗?

  •  6
  • adrianm  · 技术社区  · 14 年前

    我们是一些开发人员,但大多数时候每个项目只有一个开发人员。

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

    今天,所有东西都存储在一个存储库中。

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

    这个过程已经运行了很多年,但是当前的工具(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并挂起客户端。

    另一种方法是使用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
    

    很好,但对一些开发人员来说有点复杂

    所有的开发人员都需要有所有的项目。

    随着许多现有的项目和新的每周增加,我们需要一种方法来拉所有项目一举,也克隆新的。

    文档中的行是一个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
        )
    )
    
    1 回复  |  直到 14 年前
        1
  •  8
  •   Paul S    14 年前

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

    在DVCS回购中尝试多个项目只会带来痛苦。

    我个人更喜欢通过SSH而不是HTTP来服务项目。一个原因是有能力。。。

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

    如果你是通过HTTP服务的,这是行不通的(你已经发现了)。我很惊讶它会导致一次严重的碰撞:-/

    在特定版本 .

    但不是你真正想要的。

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

    推荐文章