gpt4 book ai didi

mercurial - DVCS (Mercurial) 不适合我吗?

转载 作者:行者123 更新时间:2023-12-02 23:48:04 24 4
gpt4 key购买 nike

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

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

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

过程很简单。

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

没有标记也没有分支。早期版本是根据日期 checkout 的。

这个过程多年来一直运行良好,但当前工具 (CVS) 存在一些痛点

  • 慢。即使没有任何改变,结账也需要几分钟。历史记录存储在服务器上,因此差异需要很长时间
  • 添加新项目。如果您使用过 CVS,您就会知道它就像:添加文件夹、在文件夹中添加文件、添加下一个文件夹...
  • 无法消除明显的错误( checkin 二进制文件等)
  • 不支持重命名,这使得必要的重构更加痛苦。

我私下使用 Mercurial 一段时间了,希望将其扩展到所有开发人员。

我可能全错了,但有一些事情我不明白如何在我们的组织中实现。

CVS 提交仅是当前文件夹,但在 Mercurial 中它们是存储库范围内的。在我们的例子中,这意味着在一个文件夹中提交维护工作也会在另一个文件夹中提交尚未完成的内容。(我假设我们可以在更改的文件夹中执行 hg ci ./** ,但 merge 时不允许这样做,至少文档是这么说的 If you are committing the result of a merge, do not provide any filenames or -I/-X filters. )

Mercurial 中的常见做法是每个项目都有一个存储库。

每个项目一个存储库对我们来说没问题,但它会产生一些其他问题,例如:

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

hg push <a href="http://localhost:8000/Customer1/NewProject" rel="noreferrer noopener nofollow">http://localhost:8000/Customer1/NewProject</a>

通过丑陋的堆栈转储使 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

可以工作,但对于某些开发人员来说有点复杂

所有开发人员都需要拥有所有项目。
(并非所有项目都是链接的,但许多项目都是链接的,因此它们需要存在,并且最简单的是拥有所有项目)

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

我认为子存储库可以解决“全局”拉力,但以下内容文档中的一行是一个精彩的内容

“当我们提交时,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
)
)

最佳答案

您有权说 Mercurial 是为每个存储库的一个项目而设计的。当您像这样工作时也会好得多,因为不同项目的历史记录是分开的。

尝试在 DVCS 存储库中包含多个项目只会带来痛苦。

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

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

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

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

但这并不是你真正想要的。

可能,通用的东西应该是需要它的项目的子存储库。然后,每个项目可能会被卡住在相同代码的不同版本上,并且您不会遇到任何问题。这需要稍微考虑一下。

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

关于mercurial - DVCS (Mercurial) 不适合我吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4119462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com