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

时间:2017-08-03 23:48:46

标签: mercurial web-deployment

TL;博士; hg clone ssh://hg@bitbucket.org/team/repo ~/prod/失败,"目的地不为空"如果〜/ prod /不是空的。我可以强行克隆吗?

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

- 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。如果目录不存在或为空,它可以很好地工作。但是,只要我克隆了一次回购,这个剧本就会以destination is not empty失败。

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

我只想强迫克隆。但我找不到办法。据推测,这是错误的,Mercurial不允许我这样做。为什么以及什么是更好的方式?

1 个答案:

答案 0 :(得分:2)

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