【问题标题】:Clone a Mercurial repository into a non-empty directory将 Mercurial 存储库克隆到非空目录中
【发布时间】:2017-08-03 23:48:45
【问题描述】:

tl;dr; 如果 ~/prod/ 不为空,hg clone ssh://hg@bitbucket.org/team/repo ~/prod/ 将失败并显示“目标不为空”。我可以强制克隆吗?

我正在尝试编写我的第一个 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

据我了解,它确保部署目录存在,然后将 repo 克隆到那里。如果目录不存在或为空,它会很好地工作。但是,一旦我克隆了一次 repo,这个剧本就会失败,destination is not empty

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

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

【问题讨论】:

标签: mercurial web-deployment


【解决方案1】:

虽然我还没有在任何地方读过它,但看起来强制克隆是不可能的。正如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"

【讨论】: