我怎样才能部署/推我的git仓库的子目录到Heroku?

我有一个项目,使用服务和版本控制使用Git。 Serve将创build一个output文件夹,其中包含要部署到Heroku的静态文件。

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

有没有办法将子文件夹部署到git远程? 我应该在output文件夹中创build一个Git仓库(这听起来不对),并把它推到Heroku?

通过git-subtree有一个更简单的方法。 假设你想把你的文件夹“输出”作为root加到Heroku中,你可以这样做:

 git subtree push --prefix output heroku master 

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

我有一个类似的问题。 在我的情况下,将heroku存储库中的所有内容全部删除并将其replace为我的子目录中的任何内容都不是问题。 如果这是你的情况,你可以使用下面的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 - 

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

我从约翰·贝里曼(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,不要因此分心

如果你这样做的话,你可以自己开始受到各种伤害。 所有上述的解决scheme都失败了:

  1. 它需要每次或定期执行某些操作,或发生意想不到的事情(推动子模块,同步子树,…)
  2. 如果你使用引擎来模块化你的代码,Bundler会把你活着吃掉,在这个项目中寻找一个好的解决scheme时,不可能描述我对这个项目感到沮丧的程度
    • 你尝试添加引擎作为git回购链接+ bundle deploy – 失败,你需要捆绑每次更新
    • 您尝试将引擎添加为:path + bundle deploy – fail,开发团队认为:path选项是“您不使用Bundler和这个gem选项”,所以它不会捆绑生产
    • 另外,引擎的每一次刷新都想更新你的rails堆栈-_-
  3. 我发现唯一的解决scheme是在开发中使用引擎作为/vendor符号链接,并实际上复制文件进行生产

解决scheme

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

  1. API – 取决于configuration文件将运行在2个不同的英雄主机 – 上传和API
  2. 网站 – 网站
  3. networking旧 – 旧网站,仍在迁移
  4. 常见 – 在引擎中提取的常见组件

所有的项目都有一个vendor/common符号链接来查看common引擎的根。 当编译部署到Heroku的源代码时,我们需要删除符号链接和rsync,它的代码实际上位于每个独立主机的供应商文件夹中。

  1. 接受一个主机名列表作为参数
  2. 在你的开发仓库中运行git push,然后在一个单独的文件夹中运行一个干净的git pull,确保没有肮脏的(未被完成的)更改被自动推送到主机
  3. 并行部署主机 – 每个heroku git repo被拉,新代码rsynced到正确的地方,在git commit评论中提交基本的推送信息,
  4. 最后,我们发一个蜷曲的乒乓,告诉业余爱好者醒来,把日志尾巴,看看是不是都喝了酒
  5. 与jenkins也很好:D(成功testing后,自动代码推动testing服务器)

在6个月的时间里,在极端(没有?)的问题中工作得非常好

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

更新1

@AdamBuczynski,它从来没有这么简单。

第一,你将永远有一个生产和testing环境至less – 和一堆特定function的集群更糟糕 – 突然一个文件夹需要映射到n个英雄项目作为一个非常基本的要求,这一切都需要组织起来,以便脚本“知道”你想在什么地方部署,

第二你会想在项目之间共享代码 – 现在是sync_common部分,shennanigans的符号链接正在开发中被Heroku上的实际rsynced代码取代,因为Heroku需要特定的文件夹结构和捆绑器,而rubygems确实真的让事情变得非常糟糕你想提取共同的线程成gem

第三,你会想要插入CI,它会改变一下subfolders和git repo是如何组织的,最后在最简单的可能用例中,最后提到上述要点。

在其他项目中,我需要插入Java版本,当向多个客户端销售软件时,您需要根据安装要求过滤需要安装的模块,

我真的应该考虑将事情捆绑到一个Rake文件或其他东西,并尽一切办法…