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

Posted

技术标签:

【中文标题】我更改存储库 URL 后 Capistrano 部署失败【英文标题】:Capistrano deploy fails after I changed the repository URL 【发布时间】: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 只删除旧缓存?

【问题讨论】:

【参考方案1】:

适用于 Capistrano 3.0+

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

    更改服务器上 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

    删除$deploy_to/repo目录 修改你的config/deploy.rb(同2.X) 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"

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

【讨论】:

以上是关于我更改存储库 URL 后 Capistrano 部署失败的主要内容,如果未能解决你的问题,请参考以下文章

Capistrano 和 GitHub 私人回购 - 权限被拒绝(公钥)

Capistrano 和几个 SSH 密钥

从 GitHub 部署 Key 问题 Capistrano

使用 capistrano 从不同的 git 分支进行部署

Git没有编辑远程存储库的访问权限

存储库和工作单元模式 - 如何保存更改