我更改存储库 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 部署失败的主要内容,如果未能解决你的问题,请参考以下文章