【问题标题】:Capistrano deploy fails after I changed the repository URL我更改存储库 URL 后 Capistrano 部署失败
【发布时间】:2012-01-11 14:17:02
【问题描述】:

我通过 capistrano 从 Git 存储库进行了简单的部署。起初我从 GitHub 部署,一切正常。但后来我将我的存储库移到了 BitBucket,现在我得到了

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

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

set :deploy_via, :remote_cache

set :deploy_via, :copy

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

【问题讨论】:

    标签: ruby deployment capistrano


    【解决方案1】:

    适用于 Capistrano 3.0+

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

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

    【讨论】:

      【解决方案2】:

      这是 this answer 所谈论的 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
      

      【讨论】:

        【解决方案3】:

        Capistrano 2.X

        使用新地址删除并重新克隆 repo:

        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

        【讨论】:

        • 我会说这是更好的答案。如果您删除所有版本,如果您的新部署失败并且您无法回滚,那么您基本上处于糟糕的状态。我还认为值得注意的是,手动克隆 repo 只需要将主机添加到已知主机。如果它已经被添加,那么部署将起作用(所以本质上与第一次设置 capistrano 时相同,在任何地方检查 repo 只是为了添加它)
        • @KennyLövrin 是的,在任何地方克隆 repo 都会让您的主机进入已知主机,但是如果您设置了 :remove_cache,您需要缓存副本目录中的某些内容,否则 capistrano 将无法部署。跨度>
        • 请记住 capistrano 3.1 使用 shared/repo 而不是 shared/cached-copy 所以这个答案虽然几乎是正确的,但应该更新。
        • 在 capistrano 3.2.1 中,我解决了删除 $deploy_to/repo 文件夹的问题,因为我在 shared 中找不到任何 repo 文件夹。
        • 这是更好的答案
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          您需要更改 /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
          

          尝试上限生产部署

          【讨论】:

            【解决方案6】:

            我得说我不确定,因为我无法对此进行测试,但这应该可以:

            cap deploy:cleanup -s keep_releases=0
            

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

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

            【讨论】:

            • 这并没有完全解决问题,但是一旦我删除了shared/cached-copy,它现在就可以正常部署了。
            • 它对我也不起作用,但 Jakub 的评论在这里起作用。
            • 您只需将远程源的 url 更改为 shared/cached-copy 目录中的新仓库地址即可。
            • 答案只删除服务器上的所有版本(包括当前版本)。最好的答案(如果您启用了远程缓存)是 Jakub Arnold 的答案。
            • 从 Capistrano 3 开始,您必须删除 /repo 而不是 shared/cached-copy。编辑:见Justin Tanner's answer
            【解决方案7】:

            Capistrano 2 及以下

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

            Capistrano 3 及以上

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

            查看Fixing Capistrano 3 deployments after a repository change

            【讨论】:

            • 不错的解决方案。假设./repo/config -> path_to_your_repo/repo/config(开始不清楚)
            【解决方案8】:

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

            在此处阅读我的原始答案以及如何解决类似问题Capistrano error when change repository using git

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

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

                这会使部署速度变慢一些,因此一旦您对所有部署目标都赶上了,就值得将其删除。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多