首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DVCS (汞)不是给我的吗?

DVCS (汞)不是给我的吗?
EN

Stack Overflow用户
提问于 2010-11-07 20:10:00
回答 1查看 394关注 0票数 6

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

代码语言:javascript
复制
Customer1
    ProjectX
        App
        Tests
    ProjectY
        App
        Tests
Customer2
    Project2
Products
    Product1
Common

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

这个过程很简单。

开发人员为customer

  • Create承担一个新项目--一个新项目中的项目

  • 代码的新文件夹--

  • 在另一个项目中进行一些维护,以检查维护项目

H 112的更新,在新project

  • Deliver中为客户提供更多的工作&

  • Deliver>H 217G 218

没有标记,也没有分支。以前的版本是根据日期签出的。

这一过程多年来一直有效,但目前的工具(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

使用丑陋的堆栈转储使崩溃,并挂起客户端。

我的理解是,开发人员需要访问服务器shell,才能将新的存储库添加到配置文件中,并重新启动hgweb。

另一种方法是使用SSH或共享(使用SSH而不是文件共享是否有好处?)

代码语言:javascript
复制
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将尝试创建整个项目及其subrepos状态的一致快照。它首先尝试在所有修改的子记录中提交,然后记录所有subrepos的状态。”

回到全局提交的单一存储库问题。

(尝试了一些hg ci .hgsub .hgsubstate <subrepo>的变体,但.hgsubstate似乎只有在完全提交时才会更新。如果项目文件夹中没有显式的hg pull --update,其他用户将不会看到项目更改)

我目前的想法是在根目录中有一个批处理文件,用于提取所有项目。

关于如何在我们的组织中使用汞,还有其他的想法吗?

编辑

谢谢你的回复。我目前正在评估每个项目一个存储库将如何为我们工作。我把一个批处理文件放在最上层

代码语言:javascript
复制
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
    )
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-08 00:21:21

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

尝试在DVCS回购中进行多个项目只会造成痛苦。

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

代码语言:javascript
复制
# hg init blah
# hg clone blah ssh://server/blah

如果您是通过HTTP提供服务的,这是不起作用的(正如您已经发现的)。不过,我很惊讶它会造成严重的崩溃:-/

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

但并不是你想要的。

可能,常见的东西应该是需要它的项目的子回购。然后,每个项目都可能被冻结在同一代码的不同版本上,您没有任何问题。这需要考虑一下。

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4119462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档