2010-11-07 37 views
6

我在一家公司工作,我们在那里创建了很多小客户特定的应用程序。 我们是少数开发人员,但大多数情况下,每个项目只有一名开发人员。DVCS(Mercurial)不适合我吗?

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.

在水银通常的做法是让每个项目一个资料库。每个项目

一个存储库对我们来说是确定的,但它会建立像其他一些问题:

如何在中央服务器上管理多个存储库?
如果开发人员创建了一个新的项目,他最终需要推动他的变化。 只是做

hg push http://localhost:8000/Customer1/NewProject

崩溃的HG-Web服务器和一个丑陋的堆栈转储和挂起客户端。

我的理解是,开发人员需要访问服务器外壳到新存储库添加到配置文件并重新启动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可以解决的“全球性”上拉,但下面 行的文档中是一个搅局者

“当我们承诺,水银会尝试创建整个的状态一致的快照项目及其subrepos 它首先尝试提交所有修改的subrepos,然后记录所有subrepos的状态。“

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

(试过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 
    ) 
) 
+0

[“只是因为你可以使用分布式的DVCS并不意味着你必须。”](http://stackoverflow.com/q/3854611) – 2010-11-08 09:32:17

回答

8

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

试图在DVCS仓库中有多个项目只会导致痛苦。

我个人更喜欢通过SSH而不是HTTP来提供项目。原因之一是能力... ...

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

如果您是通过HTTP这不起作用服务(如你发现了)。我很惊讶它会导致硬碰撞,但: -/

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

不是你真正想要的。

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

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