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

Ruby 在我更改存储库URL后,Capistrano部署失败,ruby,deployment,capistrano,Ruby,Deployment,Capistrano,我有一个从Git存储库通过capistrano进行的简单部署。起初我正在部署FormGithub,一切都很好。但后来我把我的存储库移到了BitBucket,现在我得到了 fatal: Could not parse object '9cfb...'. 一旦我改变,问题就消失了 set :deploy_via, :remote_cache 到 但这并不能解决问题,只能绕过它。有什么办法可以让capistrano直接删除旧缓存吗?我得说我不确定,因为我还没有测试过,但这应该可以: cap dep

我有一个从Git存储库通过capistrano进行的简单部署。起初我正在部署FormGithub,一切都很好。但后来我把我的存储库移到了BitBucket,现在我得到了

fatal: Could not parse object '9cfb...'.
一旦我改变,问题就消失了

set :deploy_via, :remote_cache


但这并不能解决问题,只能绕过它。有什么办法可以让capistrano直接删除旧缓存吗?

我得说我不确定,因为我还没有测试过,但这应该可以:

cap deploy:cleanup -s keep_releases=0
因为它会擦除服务器上的每个版本(缓存)


显然,您还需要删除
共享/缓存副本
,因为根据下面的评论,上面的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

  • 删除
    $deploy\u to/repo
    目录
  • 修改您的
    config/deploy.rb
    (与2.X相同)
  • cap部署

  • 我在
    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"
    

    它会使部署速度稍慢,因此,一旦您确信所有部署目标都已赶上进度,就应该删除它。

    最简单的方法就是将repo url更改为Web服务器上共享/缓存副本目录中.git/config中的新url。然后,您可以像往常一样进行正常部署。

    取决于您的版本Capistrano 3不同于它以前的版本:


    在这里阅读我的原始答案以及如何解决类似问题

    Capistrano 2及以下版本

    SSH连接到服务器并更新部署文件夹的
    /shared/cached copy/.git/config
    中的repo,或者只删除
    /shared/cached copy

    Capistrano 3及以上

    SSH连接到服务器,并在部署文件夹的
    /repo/config
    中更新repo


    选中您需要更改/shared/cached copy文件夹中的git源文件

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

    尝试cap production deploy

    如果您需要执行大量回购,您可能需要为其添加任务

    对于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
    

    以下是Capistrano3版本的内容。在每台服务器上执行答案建议的操作可能会很乏味

    所以把这个放到
    deploy.rb
    中,然后运行
    capdeploy:fix\u repo\u 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+

  • 在config/deploy.rb中更改存储库URL

  • 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
    
  • 在服务器上的your_project/repo/config文件中更改存储库URL


  • 这并没有完全解决问题,但一旦我删除了
    共享/缓存副本
    ,它现在就可以部署了。它对我也不起作用,但Jakub在这里的评论起了作用。你只需在
    共享/缓存副本
    目录中将origin remote的url更改为新的repo地址即可。答案仅删除服务器上的所有版本(包括当前)。最佳答案(如果远程缓存处于活动状态)是Jakub Arnold的。由于Capistrano 3,你必须删除
    /repo
    ,而不是
    共享/缓存副本
    。编辑:看,我认为这是更好的答案。如果你删除所有版本,如果你的新部署失败并且你无法回滚,那么你基本上处于糟糕状态。我还认为值得注意的是,手动克隆repo是错误的只需将主机添加到已知主机即可。如果已经添加了主机,则部署将起作用(因此本质上与第一次设置capistrano时相同,签出repo anywhere只是为了添加主机)@KennyLövrin是的,在任何地方克隆repo都会使您的主机进入已知主机,但是如果您有
    :删除缓存
    集,您需要缓存副本目录中的某些内容,否则capistrano将不会部署。请记住,capistrano 3.1使用
    共享/repo
    而不是
    共享/缓存副本
    ,所以这个答案几乎正确t、 应该更新。在capistrano 3.2.1中,我解决了删除
    $deploy\u to/repo
    文件夹的问题,因为我在
    shared
    中找不到任何
    repo
    文件夹。这是一个更好的解决方案。假设
    /repo/config
    路径到您的
    (开头不清楚)