如何只将 git repo 的子目录部署/推送到 Heroku?

我有一个项目,使用 发球和版本控制使用 Git。Serve 创建了一个包含静态文件的 output文件夹,我想将其部署到 Heroku。

我不想部署 Serve 项目本身,因为 Heroku Cedar 栈似乎不太喜欢它,但最重要的是我想利用 Heroku 对静态网站的巨大支持。

是否有办法将子文件夹部署到 git 远程? 我是否应该在 output文件夹中创建一个 Git repo (这听起来不对)并将其推送到 Heroku?

47334 次浏览

我也有过类似的问题。在我的例子中,清除 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 -

我相信有很多方法可以改进这一点——所以请随时告诉我如何改进!

通过 Git 子树有一个更简单的方法。假设您想将您的文件夹“ output”作为根目录推送到 Heroku,您可以这样做:

git subtree push --prefix output heroku master

目前,git-subtree 似乎已经包含在 git-core 中,但是我不知道那个版本的 git-core 是否已经发布了。

我从 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。

经过漫长而艰难的一个月尝试不同的事情每次我意识到都会被咬,

正因为 Heroku 使用 git 存储库作为部署机制,所以不应该将其视为 git 存储库

也可能是 rsync 他们选了 git 别因为这个分心

如果你这样做,你就会让自己受到各种伤害。上述所有解决方案都在某些地方惨遭失败:

  1. 它要求每次都要做一些事情,或者周期性地做一些事情,或者发生一些意想不到的事情(推动子模块,同步子树,... ...)
  2. 如果你使用一个引擎,例如模块化你的代码,Bundler 会把你生吞活剥,这是不可能描述的数量挫折,我已经与该项目期间,寻找一个好的解决方案
    • 你试图添加引擎作为 git repo 链接 + bundle deploy-失败,你需要捆绑更新每次
    • 如果您试图将引擎添加为 :path + bundle deploy-false,开发团队将 :path选项视为“您没有使用带有这个 gem 选项的 Bundler”,因此它不会捆绑到生产环境中
    • 此外,引擎的每次刷新都希望更新您的 Rails stack-_-
  3. 我找到的唯一解决方案是在开发中使用引擎作为 /vendor符号链接,并实际复制生产所需的文件

解决办法

这个应用程序在 git root 中有4个项目:

  1. Api-根据配置文件将在2个不同的 heroku 主机上运行-上传和 api
  2. 网站
  3. 旧的网站,还在迁移中
  4. 共同-在发动机中提取的共同组件

所有的项目都有一个查看 common引擎根目录的 vendor/common符号链接。在编译部署到 heroku 的源代码时,我们需要删除 symlink 并将其 rsync 的代码物理地放在每个独立主机的供应商文件夹中。

  1. 接受主机名列表作为参数
  2. 在开发回购中运行一个 git push,然后在一个单独的文件夹中运行一个干净的 git pull,确保没有脏的(未提交的)更改被自动推送到主机
  3. 并行部署主机——每个 heroku git repo 都被拉出来,新代码被同步到正确的位置,在 git 提交注释中提交基本的推送信息,
  4. 最后,我们发送一个带有卷曲的 ping,告诉业余主持人醒来,跟踪日志,看看是否都去了葡萄酒
  5. 对 Jenkins 也不错: D (测试成功后自动向测试服务器推送代码)

工程非常非常好,在野外与最小(没有?)问题现在6个月

这是 https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f的剧本

更新1

@ AdamBuczynski 事情永远不会这么简单。

首先,你总是至少拥有一个生产和测试环境——更糟糕的是,还有一大堆特定于功能的集群——突然之间,作为一个非常基本的需求,1个文件夹需要映射到 n 个 heroku 项目,而且所有这些都需要以某种方式进行组织,以便脚本“知道”你想要部署哪个源代码,

第二,你会想在项目之间共享代码——现在来到了 sync_common部分,在 Heroku 上,开发中的符号链接被实际的同步代码所取代,因为 Heroku 需要一个特定的文件夹结构,并且 bundler 和 rubygems 真的非常非常糟糕,如果你想把公共线程提取到一个 gem 中

第三,你会想要插入 CI,它会改变一点如何子文件夹和 git 回购需要组织,最后在最简单的可能用例中,你结束了前面提到的要点。

在其他项目中,我需要插入 Java 构建,当向多个客户销售软件时,你需要根据安装要求和其他情况过滤安装的模块,

我真的应该考虑把东西打包成 Rakefile 之类的东西然后用这种方式做所有的事情。

或者,您可以使用 git subtree在 GitHub 上创建一个 heroku分支,然后使用 Heroku 按钮将其部署到 Heroku:

Deploy

  1. 向您的 服务器目录添加一个 app.json,如解释的 给你所示。

  2. README.md中加入以下标记:

    [![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/username/repository/tree/heroku)
    
  3. 将您的更改推送到 heroku分支:

    git subtree push --prefix server origin heroku