13

我最近将我的几个插件变成了子模块,并意识到当你“git clone”一个存储库时,子模块目录将是空的。这对于共同开发者初始化他们的子模块和更新是有意义的。

但是,当我使用 capistrano 部署时,子模块代码显然不会被部署,这会导致问题。我可以进入发布分支并在那里初始化并更新模块,但这显然不是一个理想的解决方案。

有没有人有关于如何处理这个问题的建议?它像 capistrano 任务一样简单吗?

我在生产方面有点菜鸟。

谢谢!

4

3 回答 3

12

根据这个最近的线程,capistrano 应该能够初始化和更新您的子模块:

set :git_enable_submodules,1

.gitmodules如果您的条目是最新的,那么在 config/deploy.rb 中应该就足够了。
您可能需要修补 Capistrano ( lib/capistano/recipes/deploy/scm/git.rb)以确保包含您的子模块。

    def checkout(revision, destination)
      git      = command

      branch   = head

      fail "No branch specified, use for example 'set :branch, \"origin/master\"' in your deploy.rb" unless branch

      if depth = configuration[:git_shallow_clone]
        execute  = "#{git} clone --depth #{depth} #{configuration[:repository]} #{destination} && " 
      else
        execute  = "#{git} clone #{configuration[:repository]} #{destination} && " 
      end

      execute += "cd #{destination} && #{git} checkout -b deploy #{branch}" 

      if submodules = configuration[:git_enable_submodules]
        execute += " && git-submodule init &&" 
        execute += "git-submodule update" 
      end

      execute
    end

如果你有嵌套的子模块,你需要:

gem sources -a http://gems.github.com
$ sudo gem install morhekil-capistrano-deepmodules

只需在您的部署配置中要求它:

需要'capistrano/deepmodules'

gem 将自动处理所有其余部分。
你可以从你的配置中删除:git_enable_submodules,gem 不会注意它——如果你需要它,你已经在说你想要启用子模块。

还有一个需要注意的细节 - 目前 gem 只支持远程缓存策略。这意味着您必须添加到config以下行:

set :deploy_via, :remote_cache

它启用了远程缓存,无论如何这确实是您想要做的事情 - 如果您没有服务器端缓存,那么部署具有大量子模块和其他东西的大型代码库确实是一个麻烦的体验。

于 2009-06-05T03:55:00.130 回答
5

set :git_enable_submodules, 1如果没有这个选项,它本身就不起作用:

set :deploy_via, :remote_cache`

这似乎没有记录在任何地方,我花了一段时间才弄清楚。无论如何,即使没有子模块,拥有该选项通常也很好。

于 2011-04-06T05:33:11.950 回答
5

通过这次提交,Capistrano 支持 Git 子模块和内置的 --recursive 选项。要启用 Git 子模块支持,请将其添加到您的deploy.rb文件中:

set :git_enable_submodules, true

如果你使用递归 Git 子模块,也添加这个:

set :git_submodules_recursive, true

于 2013-01-18T00:38:22.683 回答