更改存储库 URL 后 Capistrano 部署失败

我通过 capistrano 从 Git 存储库进行了一个简单的部署。一开始我从 GitHub 部署,一切都很好。但后来我把仓库搬到了 BitBucket

fatal: Could not parse object '9cfb...'.

一旦我改变,问题就解决了

set :deploy_via, :remote_cache

set :deploy_via, :copy

但这并不能解决问题,只能绕过它。有什么办法能让 Capistrano 放下旧宝藏吗?

17482 次浏览

我得说,我不确定,因为我还没有能够测试这个,但这应该工作:

cap deploy:cleanup -s keep_releases=0

因为它清除了服务器上的每个版本(缓存)。

显然,您还需要删除 shared/cached-copy,因为根据下面的评论,这似乎不会被上面的 Capistrano 调用清除。

Capistrano 2. X

使用新地址删除并重新克隆回购协议:

cd $deploy_to/shared
rm -rf cached-copy
git clone ssh://git@example.org/new/repo.git cached-copy

修改 config/deploy.rb使用新的回购协议:

set :repository, "ssh://git@example.org/new/repo.git"
set :scm, :git
set :deploy_via, :remote_cache

再次部署:

cap deploy

Capistrano 3. X

  1. 删除 $deploy_to/repo目录
  2. 修改 config/deploy.rb(与2.X 相同)
  3. cap deploy

我在 deploy.rb中用以下内容解决了这个问题:

namespace :deploy do
task :cope_with_git_repo_relocation do
run "if [ -d #{shared_path}/cached-copy ]; then cd #{shared_path}/cached-copy && git remote set-url origin #{repository}; else true; fi"
end
end
before "deploy:update_code", "deploy:cope_with_git_repo_relocation"

它使得部署变得稍微慢一些,所以一旦您确定所有的部署目标都已经赶上了,就值得删除它。

最简单的方法就是在。在 webserver 上的 share/cached-copy 目录中的 git/config。然后您可以像往常一样进行正常的部署。

取决于你的版本 Capistrano 3不同于它的祖先:

阅读我的原始答案在这里和如何修复类似的问题 使用 git 更改存储库时 Capistrano 错误

Capistrano 2及以下

SSH 到您的服务器并更新部署文件夹 ./shared/cached-copy/.git/config中的回购,或者只是删除 ./shared/cached-copy

Capistrano 3及以上

SSH 到您的服务器,并更新部署文件夹 ./repo/config中的回购文件。

检查 修复存储库更改后的 Capistrano 3部署

您需要更改 /共享/缓存副本文件夹中的 git 起源

cd /var/www/your-project/production/shared/cached-copy
git remote remove origin
git remote add origin git@bitbucket.org:/origin.git

试试 限制生产部署

如果你需要做很多回购的,你可能想要为它添加一个任务。

对于 capistrano 3,您可以将此任务添加到 loy.rb 中

desc "remove remote git cache repository"
task :remove_git_cache_repo do
on roles(:all) do
execute "cd #{fetch(:deploy_to)} && rm -Rf repo"
end
end

然后每个阶段运行一次:

cap testing remove_git_cache_repo

这是 这个答案所谈论的 Capistrano 3版本。在每个服务器上执行答案所建议的操作可能是乏味的。

所以把它放到 deploy.rb中,然后运行 cap <environment> deploy:fix_repo_origin

namespace :deploy do
desc 'Fix repo origin, for use when changing git repo URLs'
task :fix_repo_origin do
on roles(:web) do
within repo_path do
execute(:git, "remote set-url origin #{repo_url}")
end
end
end
end

用于 Capistrano 3.0 +

  1. 更改 config/loy.rb 中的存储库 URL

  2. 更改服务器上的 your _ project/repo/config 文件中的存储库 URL。