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

我有一个简单的部署通过从Git仓库capistrano。 起初我正在部署GitHub,一切正常。 但后来我把我的库移到BitBucket,现在我越来越

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

一旦我改变,问题就消失了

 set :deploy_via, :remote_cache 

 set :deploy_via, :copy 

但是这并不能解决问题,只能绕过它。 有什么办法可以让卡皮斯特拉诺放弃旧caching吗?

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

 cap deploy:cleanup -s keep_releases=0 

因为它从服务器擦除每个版本(caching)。

显然你还需要删除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

Capistrano 2及以下

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

Capistrano 3及以上

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

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

我用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" 

它使得部署速度稍慢一些,所以一旦你感到舒服,所有的部署目标都已经赶上,这是值得的。

您需要更改/ shared / cached-copy文件夹中的git origin

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

尝试帽生产部署

最简单的方法是在web服务器的shared / cached-copy目录中将repo url更改为.git / config中的新repo url。 然后你可以照常进行正常的部署。

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

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

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

对于capistrano 3,您可以在deploy.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