使用git子模块foreach的Bitbucket管道

时间:2018-11-08 13:12:43

标签: git deployment git-submodules bitbucket-pipelines git-ftp

我想用git-ftp部署我的存储库(因为许多客户端的托管计划不包括SSH访问)到我的暂存环境中,其中WordPress作为子模块包含在内。这是我第一次尝试使用Bitbucket管道:

image: php:7.1

pipelines:
  branches:
    master:
    - step:
        deployment: staging
        script:
          - apt-get update
          - apt-get -qq install git-ftp
          - git ftp init -vv --user $sftp_user --passwd $sftp_passwd $sftp_path

即使它没有部署WordPress信息库,而是一个空的占位符文件,它仍然可以正常运行并将所有文件传输到我的服务器。

正如here所说,对子模块的支持并非一直有效,但是有一种使用

的解决方法
git submodule foreach git [init|push|catchup]

我使用Bash手动尝试了所有步骤,并且有效:

$ git ftp init --user $sftp_user --passwd $sftp_passwd -vv $sftp_path
$ git submodule foreach 'git ftp init -vv $sftp_user --passwd $sftp_passwd -vv $sftp_path/$path/'

但是,当我尝试将这种变通方法应用于我的bitbucket-pipelines.yml时,foreach的子模块命令似乎根本不起作用……仅测试命令输出

git submodule foreach 'echo $path'
+ git submodule foreach echo 'echo $path'

  1. 有人知道更好的解决方法吗?
  2. 为什么子模块(+ foreach)不起作用?是吗?
  3. 该命令应该给您access to several variables,Bitbucket的存储库变量会覆盖/阻止这些变量吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

对于您的问题的第二点:是的,它工作正常,带有+的行仅列出了已执行的命令。如果未显示任何错误,则执行正常。

关于第三点,是的,如果您设置了变量$ path,则此变量将被bitbucket覆盖,因为当然会覆盖它。如果您不这样做,它应该可以正常工作,但是我在git文档中注意到了以下内容:

  

请注意,为避免与Windows上的$ PATH冲突,现在$ path变量已弃用$ sm_path变量的同义词。该命令将忽略超级项目中定义但未检出的所有子模块。

因此,您必须将它们签出才能打印出来。当您在本地使用此命令时,我想应该检出子模块,这就是该命令在此处起作用的原因。

一种变通方法是不必使用bitbucket管道将其检出,而是使用以下命令:

git config --file .gitmodules --get-regexp path | awk '{ print $2 }'

希望对您有帮助