在Capistrano中部署Git子目录

时间:2020-03-05 18:43:34  来源:igfitidea点击:

我的主分支布局是这样的:

/ <顶级

/ client <-桌面客户端源文件

/ server <-Rails应用

我想做的只是在我的deploy.rb中下拉/ server目录,但是我似乎找不到任何方法。 / client目录很大,因此设置一个将/ server复制到/的钩子将无法很好地工作,它只需要拉下Rails应用程序即可。

解决方案

回答

不幸的是,git无法做到这一点。相反," git方法"是拥有两个存储库-客户端和服务器,并克隆所需的存储库。

回答

我们可以有两个git存储库(客户端和服务器),并将它们添加到"超级项目"(应用程序)中。在这个"超级项目"中,我们可以将两个存储库添加为子模块(请检查本教程)。

另一个可能的解决方案(更加肮脏)是为客户端和服务器设置单独的分支,然后可以从"服务器"分支中拉出。

回答

有一个解决方案。抓取针对capistrano的crdlo补丁和来自github的capistrano源代码。删除现有的capistrano gem,应用补丁,安装setup.rb,然后可以使用他非常简单的配置行set:project," mysubdirectory"来设置子目录。

唯一的麻烦是,显然github至少在写时不"支持archive命令"。我在svn上使用了我自己的私人git repo,它工作正常,我还没有在github上尝试过,但是我想如果有足够的人抱怨他们会添加该功能。

另请查看是否可以让capistrano作者将相关功能添加到cap中。

回答

看起来它也无法与codebasehq.com一起使用,所以我最终完成了清理混乱的capistrano任务:-)也许实际上,通过重写一些capistrano任务,这种方法不那么简单了...

回答

没有任何肮脏的分叉动作,甚至更脏!

在我的config / deploy.rb中:

set :deploy_subdir, "project/subdir"

然后,我将此新策略添加到我的Capfile中:

require 'capistrano/recipes/deploy/strategy/remote_cache'

class RemoteCacheSubdir < Capistrano::Deploy::Strategy::RemoteCache

  private

  def repository_cache_subdir
    if configuration[:deploy_subdir] then
      File.join(repository_cache, configuration[:deploy_subdir])
    else
      repository_cache
    end
  end

  def copy_repository_cache
    logger.trace "copying the cached version to #{configuration[:release_path]}"
    if copy_exclude.empty? 
      run "cp -RPp #{repository_cache_subdir} #{configuration[:release_path]} && #{mark}"
    else
      exclusions = copy_exclude.map { |e| "--exclude=\"#{e}\"" }.join(' ')
      run "rsync -lrpt #{exclusions} #{repository_cache_subdir}/* #{configuration[:release_path]} && #{mark}"
    end
  end

end

set :strategy, RemoteCacheSubdir.new(self)