将 Mercurial 存储库克隆到非空目录中

Clone a Mercurial repository into a non-empty directory

tl;博士; 如果 ~/prod/ 不为空,hg clone ssh://hg@bitbucket.org/team/repo ~/prod/ 失败并显示 "destination is not empty"。我可以强制克隆吗?

我正在尝试编写我的第一个 Ansible 剧本,它将我的代码从 Bitbucket Mercurial 存储库部署到我的服务器。有一个部署路径 ~/prod,其中包含所有代码文件以及 ~/prod/media~/prod/db.db 中的数据。为了确保剧本即使在 ~/prod 目录为空或不存在的情况下也能正常工作,这是我目前所拥有的:

- name: create directory
  file: path=/home/user/prod state=directory
- name: clone repo
  hg:
    repo: ssh://hg@bitbucket.org/team/repo
    dest: /home/user/prod
    force: yes

根据我的理解,它确保部署目录存在,然后将存储库克隆到那里。如果目录不存在或为空,它会很好地工作。然而,一旦我克隆了一次回购协议,这个剧本就失败了 destination is not empty.

我可以先将媒体和 db.db 移出,然后删除所有其他文件,然后克隆,然后再将数据移回。但是看起来很麻烦。

我只是想强行克隆。但我找不到办法做到这一点。大概这是错误的,Mercurial 不允许我这样做。为什么以及更好的方法是什么?

虽然我还没有在任何地方读过它,但看起来强制克隆是不可能的。如 another thread 中关于相同主题的解释,这两个备选方案是:

  • 的确,将.hg文件夹克隆到另一个目录,然后将其移动到目标目录
  • hg init /home/user/prod 然后 hg pull ssh://hg@bitbucket.org/team/repo /home/user/prod; hg update -C -R /home/user/prod.

使用第二个,可以优化 Ansible 任务,仅当目标目录不包含 .hg 时才执行此操作:

- name: recreate repo
  command: 
    hg ssh://hg@bitbucket.org/team/repo -R /home/user/prod 
    creates=/home/user/prod/.hg  # <-- only execute command if .hg does not exist
- name: update files
  hg:
    repo: ssh://hg@bitbucket.org/team/repo
    dest: /home/user/prod
    clone: no
    update: yes                  # optional, for readability
    force: yes
  notify: "restart web services"