在Capistrano中部署Git子目录
我的主分支布局是这样的:
/ <顶级
/ 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)