Для Capistrano 3.0 я использую следующее:
По моему Capfile
:
# Define a new SCM strategy, so we can deploy only a subdirectory of our repo.
module RemoteCacheWithProjectRootStrategy
def test
test! " [ -f #{repo_path}/HEAD ] "
end
def check
test! :git, :'ls-remote', repo_url
end
def clone
git :clone, '--mirror', repo_url, repo_path
end
def update
git :remote, :update
end
def release
git :archive, fetch(:branch), fetch(:project_root), '| tar -x -C', release_path, "--strip=#{fetch(:project_root).count('/')+1}"
end
end
А по моему deploy.rb
:
# Set up a strategy to deploy only a project directory (not the whole repo)
set :git_strategy, RemoteCacheWithProjectRootStrategy
set :project_root, 'relative/path/from/your/repo'
Весь важный код находится в методе стратегии release
, который использует git archive
для архивации только подкаталога репозитория, а затем использует аргумент --strip
для tar
для извлечения архива на нужном уровне.
UPDATE
Начиная с Capistrano 3.3.3, теперь вы можете использовать переменную конфигурации :repo_tree
, что делает этот ответ устаревшим. Например:
set :repo_url, 'https://example.com/your_repo.git'
set :repo_tree, 'relative/path/from/your/repo' # relative path to project root in repo
См. http://capistranorb.com/documentation/getting-started/configuration.