将git存储库的一部分推送到heroku

时间:2013-08-09 23:39:12

标签: git heroku

我有一些由git管理的源代码,我想推送到Heroku。源代码包含多个不同的产品,其中一些产品将拥有自己的heroku实例。所以像这样:

src/
 lib-files/
 app1/
 app2/
 app3/
 other-files/
 package.json

所以在heroku中,我有app1和app2的实例。这两个都依赖于./lib-files和package.json,但不依赖于app2或app3或其他文件。

我真的不想将包含所有文件的整个git存储库推送到每个应用程序的heroku。换句话说,我不希望app1实例包含app2或app3或其他文件的代码,因为它有很多不需要的数据,而且需要复制它。

我通过为每个应用程序创建新的git repos来解决这个问题(一个只包含app1需要的东西,一个用于app2等),然后将这些个人回购推送到heroku。这可行,但似乎有点hacky因为我有我必须管理的所有其他额外的存储库。此外,如果其他开发人员想要推送到heroku,我需要让他们可以使用这些回购,也许可以将它们检入git(看起来奇怪)。

实现这一目标的好方法是什么?


更新

如果我创建了heroku repos,那么他们只为每个应用程序包含适当的东西然后让heroku成为那些repos的主要远程(而不是github)怎么办?我仍然会有多个存储库来处理,但至少所有开发人员都有一个标准的位置来克隆它们(源代码仓库在github中,而heroku部署仓库在heroku中)。对此的想法?

3 个答案:

答案 0 :(得分:5)

我选择的解决方案是分支。您拥有包含所有文件的主分支,然后是每个仅包含其所需内容的应用程序的分支。

例如:

$ git init
$ git add .
$ git commit -m "Initial commit"
$ git checkout -b app1   # create a new branch for app1 derived from master
$ git rm what-you-dont-need-for-app1
$ git commit -m "Initial app1 commit"
$ git checkout master    # switch to master again
$ git checkout -b app2
$ # repeat same steps as for app1

您还可以在每个分支中拥有一个唯一的.gitignore - 文件来告诉git您不想提交的内容。

答案 1 :(得分:1)

我最终这样做的方法是让heroku为那里部署的应用程序版本提供主要遥控器。同时,每个人都在使用的主要源代码仓库是github。假设代码如下所示:

src/
 app1/
 app2/
 app3/
 lib-files/
 other-files/
 package.json

然后我为app1和app2提供了两个heroku应用程序。这些只是每个应用程序所需的代码:

APP1:

src/
  app1/
  lib-files/
  other-files/
  package.json

APP2:

src/
  app2/
  lib-files/
  other-files/
  package.json

如果您想处理源代码,请从github克隆完整版本。如果要部署到heroku,请从那里克隆其中一个应用程序存储库。

我创建了一个脚本来部署执行以下操作的每个应用程序:

  1. 克隆来自heroku的git repo(如果本地框中尚不存在)
  2. 仅将该应用程序所需的文件从主源代码库复制到heroku repo
  3. 提交更改
  4. 将回购推送至heroku
  5. 我遇到的一个问题是我的每个应用程序都有自己的Node.js应用程序,我通常在开发环境中启动每个应用程序,进入该目录并运行node命令:

    cd app1
    node server.js
    

    但是,这在Heroku上并不是那么好用,因为它希望Procfile和package.json文件位于git repo的最外层目录中。我的package.json文件已经位于那里,但是我必须为每个应用程序创建单独的Procfiles并根据我正在部署的那个来复制它们。它们每个看起来都像这样:

    web: node app1/app.js
    

    无论如何,这种设置似乎有效。

答案 2 :(得分:0)

我遇到了完全相同的问题(正如我猜测的那样),并且选择不同:我为每个应用程序都有一个单独的存储库,以及共享代码的存储库。我通过requirements.txt在磁盘本地和Heroku上的应用程序之间共享代码。这是我的SO帖子:

Sharing Python code between Heroku apps