【问题标题】:How do clone a Mercurial repository into a directory that already exists?如何将 Mercurial 存储库克隆到已经存在的目录中?
【发布时间】:2011-04-07 01:08:35
【问题描述】:

我有一个客户的 Django 项目,我正在本地开发,使用 Mercurial 进行版本控制。我将本地存储库推送到我的个人远程服务器(我保存所有项目的地方),然后当我开始部署它(在任何 Web 服务器上)时,我从我的个人服务器克隆该存储库。

这在大多数服务器上都可以正常工作(我可以完全控制),但我有一些项目正在部署到 WebFaction。 WebFaction 很棒,但它的设置有点不寻常,因为我需要首先通过他们的控制面板将 Django 项目声明为“应用程序”。这会自动创建一些东西,例如“apache2”、“myproject”等文件夹。这是同一个文件夹,但我想从我的个人远程服务器克隆存储库。执行通常的 hg clone 命令不起作用,因为它说目标文件夹已经存在。对于这个文件夹的内容,我真的无能为力,所以我需要解决这个问题。

我不是 Mercurial 方面的专家,我似乎可以解决的唯一方法是将其克隆到另一个文件夹,然后将所有内容(包括 .hg)移动到我想要的实际文件夹中。不过这看起来很傻……

我正在使用 Mercurial v1.6.2(通过 easy_install 安装)。有人可以分享一下吗?

非常感谢。

【问题讨论】:

标签: django version-control mercurial ssh


【解决方案1】:

只复制 .hg 目录肯定有效,但您也可以先复制 hg init,然后再复制 hg pull http://remote/repo。刚刚初始化的 repo 只有 000000000000000 变更集,因此您可以从任何 repo 中提取而不会收到“无关 repos”警告。这与手动初始化的hg clone --pull 基本相同。

【讨论】:

  • 拉后我不得不hg update。我拉了一个特定的修订版-r X
  • 这太棒了!但我不得不承认,我有点惊讶克隆上没有 --force 选项来忽略额外的文件。
【解决方案2】:

您可以在事后移动文件夹,也可以只创建一个符号链接。我的 webfaction 目录实际上是符号链接的,所以我知道它工作正常。

【讨论】:

    【解决方案3】:

    总的来说,您似乎正在尝试将 Mercurial 用作安装管理器,这当然不是它的设计目标。

    如果我没看错的话,你的源代码库的一部分应该是 make deploy 之类的东西,它将文件放在适当的位置。换句话说,在您的部署目录中有一个存储库克隆(在 .hg 中)似乎很奇怪且容易出问题。

    【讨论】:

    • 实际上,很多人都这样做,而且效果很好。通常,对具有changegroupq hook that does an automatic update 的生产服务器执行push。在堆栈溢出中存在很多问题,建议使用这种设置。使用“生产”标签等作为自动更新的目标非常巧妙。
    • @Ry4an:这里至少有一个反驳论点,它提出了我所关心的相同问题。这不是“正确的”,但它是我的搜索出现的唯一相关的,我很想看到另一边的代表。如果您使用的是提交钩子,那么似乎必须有一个隐式的“安装”脚本,它只是从 hg 触发的。我从来没有做过直接部署,所以我想知道我错过了什么“船”。 *.com/questions/2361708/…
    • 再看我的项目后,我必须同意msw。我在这里把事情复杂化了,看来我应该只是控制我的实际 Django 项目文件夹的版本,而不是它周围的东西。在这种情况下,这是有道理的。谢谢。
    • 我不明白这是如何回答这个问题的。我在尝试为 mercurial 创建自动构建时遇到了同样的麻烦,因为我非常简单的单文件签出构建脚本希望已经存在于克隆目标中,而不是必须为 1 个脚本文件创建一个文件夹,而其他所有内容都在一个子文件夹。
    【解决方案4】:

    您可以只复制 .hg 文件夹,然后恢复或更新为小费。例如:

    cp -a src/.hg dest/
    cd dest
    hg up -C
    

    【讨论】: