我有一个使用Serve的项目,并使用Git进行版本控制。 Serve创建一个output
文件夹,其中包含我想要部署到Heroku的静态文件。
我不想部署Serve项目本身,因为Heroku Cedar堆栈似乎不太喜欢它,但最重要的是我想利用Heroku对静态网站的大力支持。
有没有办法将子文件夹部署到git遥控器?
我应该在output
文件夹中创建一个Git仓库(听起来不对)并将其推送到Heroku吗?
答案 0 :(得分:189)
通过git-subtree有一种更简单的方法。假设您想将文件夹'output'作为根目录推送到Heroku,您可以这样做:
git subtree push --prefix output heroku master
目前似乎git-subtree被包含在git-core中,但我不知道该版本的git-core是否已经发布。
答案 1 :(得分:8)
我有类似的问题。在我的情况下,删除heroku存储库中的所有内容并将其替换为我子目录中的任何内容从来都不是问题。如果是这种情况,您可以使用以下bash脚本。只需将它放在您的Rails应用程序目录中即可。
#!/bin/bash
#change to whichever directory this lives in
cd "$( dirname "$0" )"
#create new git repository and add everything
git init
git add .
git commit -m"init"
git remote add heroku git@heroku.com:young-rain-5086.git
#pull heroku but then checkback out our current local master and mark everything as merged
git pull heroku master
git checkout --ours .
git add -u
git commit -m"merged"
#push back to heroku, open web browser, and remove git repository
git push heroku master
heroku open
rm -fr .git
#go back to wherever we started.
cd -
我确信有很多方法可以改进这一点 - 所以请随时告诉我如何!
答案 2 :(得分:7)
我从John Berryman所说的开始,但实际上,如果你根本不关心heroku git历史,它会更简单。
cd bin
git init
git add .
git commit -m"deploy"
git push git@heroku.com:your-project-name.git -f
rm -fr .git
我认为官方git subtree
是最好的答案,但我有问题让子树在我的Mac上工作。
答案 3 :(得分:3)
经过漫长而艰难的一个月尝试不同的事情,每次我意识到被咬了之后,
因为Heroku使用git存储库作为部署机制,所以不应将其视为git存储库
它也可能是rsync,他们选择git,不要因此而分心
如果你这样做,你就会受到各种伤害。所有上述解决方案在某处都失败了:
bundle deploy
- 失败,您需要每次捆绑更新:path
+ bundle deploy
- 失败,开发团队将:path
选项视为"您未使用Bundler宝石选项"所以它不会捆绑生产/vendor
符号链接,并实际复制文件以进行生产有问题的应用程序在git root中有4个项目:
所有项目都有一个vendor/common
符号链接,用于查看common
引擎的根目录。在编译用于部署到heroku的源代码时,我们需要删除符号链接并将它的rsync代码物理地放在每个单独主机的供应商文件夹中。
在野外工作非常好,6个月现在很少(没有?)问题
这里是脚本https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f
@AdamBuczynski,它从未如此直截了当。
第一,你将始终拥有一个生产和测试环境 - 并且更糟糕的是一堆功能特定的集群 - 突然1个文件夹需要映射到n个heroku项目作为一个非常基本的要求,它都需要组织某种程度上,以便脚本"知道"你要在哪里部署什么来源,
第二,你想要在项目之间共享代码 - 现在是sync_common
部分,开发中的符号链接的shennanigans被Heroku上的实际rsynced代码所取代,因为Heroku需要一个特定的文件夹结构,捆绑器和rubygems真的真的如果你想将常见的线程提取到一个gem中,那真的会让事情变得非常糟糕
第3,你会想要插入CI,它会改变一些子文件夹和git repo需要组织的方式,最后在最简单的用例中你得到了上述的要点。
在其他项目中,我需要插入Java版本,在向多个客户端销售软件时,您需要根据安装要求和诸如此类的东西来过滤安装的模块,
我应该考虑将搜索内容捆绑到Rakefile或其他东西中,然后按照这样的方式进行操作......
答案 4 :(得分:0)
或者,您可以使用 git subtree
在 GitHub 上创建一个 heroku
分支,然后您可以使用 Heroku 按钮将其部署到 Heroku:
将 app.json
添加到您的 server 目录,如 here 所述。
将以下降价添加到 README.md
:
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/username/repository/tree/heroku)
将更改推送到 heroku
分支:
git subtree push --prefix server origin heroku