【问题标题】:Why does Capistrano remove .git repository upon deployment?为什么 Capistrano 在部署时删除 .git 存储库?
【发布时间】:2014-10-24 14:41:08
【问题描述】:

我正在 lib/capistrano/setup.rake 文件下部署具有以下特定任务的 Web 应用程序:

 69   desc "Publish git commit log to changelog.txt"
 70   task :publish_changelog do
 71     on roles(:web) do
 72       log = "#{deploy_to}/current/public/changelog.txt"
 73       execute "echo '============ Last deployed on' `date` ============\n > #{log}"
 74       execute "echo >> #{log}"
 75       execute "cd #{deploy_to}/current && git log --since=\"10 days ago\" >> #{log}"
 76     end
 77   end

我知道这只是我的应用程序的一项特定任务,但我遇到的问题是,当我尝试运行此命令时,它会中断,因为在我部署我的应用程序后,Capistrano 删除了我的 .git 目录位于服务器角色(:web) 上的应用程序。

仅当角色 (:web) 下的应用程序是 git 存储库时,上述命令才有效。本质上,这意味着我必须 ssh 进入 Web 服务器,删除以前是 git 存储库的应用程序“当前”,然后再次继续克隆它。完成后,运行上述 Capistrano 任务即可。为什么呢?我一定是错过了什么。

这是我的推断。当我部署 Capistrano 应用程序时,Capistrano 必须用 git 目录替换我的“当前”目录并粘贴到一个新目录上,从而有效地删除 .git 目录。尽管 Capistrano 创建了一个共享和发布目录,但它必须粘贴在我当前的目录上。这是Capistrano所做的吗?继续前进将不胜感激。我正在尝试决定是否需要重写命令,或者是否需要以某种方式配置 Capistrano。谢谢。

【问题讨论】:

    标签: ruby-on-rails capistrano


    【解决方案1】:

    Capistrano 将克隆的存储库保存在 #{deploy_to}/repo 中。有一个很好的路径变量:repo_path

    请注意,该路径上的 git 存储库实际上是一个“裸存储库”。

    以这种方式在性能方面是有意义的,因为 repo 仅被克隆到此路径一次。之后,repo 只会更新速度更快,尤其是对于大型 repo。在每次部署时将 git 存储库克隆到 current_path 需要更长的时间。

    也就是说,这是你的任务的精简版本应该可以工作:

    desc "Publish git commit log to changelog.txt"
    task :publish_changelog do
      on roles(:web) do
        within repo_path do
          execute :git, :log, "--since='1100 days ago'"
        end
      end
    end
    

    【讨论】:

    • 感谢@Bruno!顺便说一句,你怎么知道 repo_path 是一个命名路径,而 :git 和 :log 是类似符号的语法。我一直很难找到可靠的参考。
    • 我一直在使用 capistrano 并阅读它的源代码。源代码真的写得很好 - 几乎所有你可能需要的东西都有路径方法。检查他们in this file。对于类似符号的命令语法,请查看sshkit gem - capistrano 使用它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    相关资源
    最近更新 更多