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

时间:2011-09-24 13:39:32

标签: git heroku

我有一个使用Serve的项目,并使用Gi​​t进行版本控制。 Serve创建一个output文件夹,其中包含我想要部署到Heroku的静态文件。

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

有没有办法将子文件夹部署到git遥控器? 我应该在output文件夹中创建一个Git仓库(听起来不对)并将其推送到Heroku吗?

5 个答案:

答案 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,不要因此而分心

如果你这样做,你就会受到各种伤害。所有上述解决方案在某处都失败了:

  1. 每次都需要做一些事情,或者定期或者意外的事情发生(推送子模块,同步子树......)。
  2. 如果你使用引擎来模块化你的代码,Bundler会活着吃掉你,在找到一个好的解决方案的过程中我无法描述我对该项目的挫败感为了这
    • 您尝试将引擎添加为git repo link + bundle deploy - 失败,您需要每次捆绑更新
    • 您尝试将引擎添加为:path + bundle deploy - 失败,开发团队将:path选项视为"您未使用Bundler宝石选项"所以它不会捆绑生产
    • 此外,每次刷新引擎都要更新您的rails stack -_-
  3. 我发现的唯一解决方案是在开发中将引擎用作/vendor符号链接,并实际复制文件以进行生产
  4. 解决方案

    有问题的应用程序在git root中有4个项目:

    1. api - 取决于配置文件将在2个不同的heroku主机上运行 - upload和api
    2. 网站 - 网站
    3. web-old - 旧网站,仍在迁移中
    4. 常见 - 在引擎中提取的常见组件
    5. 所有项目都有一个vendor/common符号链接,用于查看common引擎的根目录。在编译用于部署到heroku的源代码时,我们需要删除符号链接并将它的rsync代码物理地放在每个单独主机的供应商文件夹中。

      1. 接受主机名列表作为参数
      2. 在你的开发仓库中运行一个git push,然后在一个单独的文件夹中运行一个干净的git pull,确保没有脏的(未经修改的)更改自动推送到主机
      3. 并行部署主机 - 每个heroku git repo被拉出,新代码被发送到正确的位置,在git commit注释中提交基本推送信息,
      4. 最后,我们发送了一个curl ping,告诉业余主机唤醒并拖尾日志,看看是否全部都是葡萄酒
      5. 与jenkins一起玩得很好:D(成功测试后自动代码推送测试服务器)
      6. 在野外工作非常好,6个月现在很少(没有?)问题

        这里是脚本https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f

        更新1

        @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:

Deploy

  1. app.json 添加到您的 server 目录,如 here 所述。

  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