2014-08-30 60 views
1

我与下的lib/Capistrano的/ setup.rake文件中的以下特殊任务部署Web应用程序:为什么Capistrano在部署时删除.git存储库?

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删除位于服务器角色(:web)上的应用程序中的.git目录。

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

这是我推断出来的。当我部署一个Capistrano应用程序时,Capistrano必须用git目录替换我的“当前”并粘贴一个新的,有效地删除.git目录。虽然Capistrano创建了一个共享目录和释放目录,但它必须粘贴我目前的目录。这是什么Capistrano呢?一个导致继续下去,将不胜感激。我试图决定命令是否需要重写,或者如果我需要以某种方式配置Capistrano。谢谢。

回答

3

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

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

拥有这种方式使得性能更合理,因为回购克隆到此路径只有一次。之后,回购仅更新更快,特别是对于大回购。在每次部署时将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 
+0

感谢在@Bruno!顺便说一下,你怎么知道repo_path是一个命名路径,并且:git和:log是象语法一样的符号。我一直很难找到一个可靠的参考。 – 2014-09-01 01:28:26

+2

我一直在使用capistrano很多,并阅读它的源代码。源代码非常精美 - 有几乎所有你可能需要的路径方法。检查他们[在这个文件中](https://github.com/capistrano/capistrano/blob/master/lib/capistrano/dsl/paths.rb)。对于命令的符号式语法,请查看[sshkit](https://github.com/capistrano/sshkit)gem - capistrano使用它! – 2014-09-01 13:25:50