Reputation: 2639
I have a project that uses Serve and is version controlled using Git. Serve creates an output
folder with static files that I want to deploy to Heroku.
I don't want to deploy the Serve project itself since the Heroku Cedar stack doesn't seem too fond of it, but most importantly I want to take advantage of Heroku's great support for static websites.
Is there a way to deploy a subfolder to a git remote?
Should I create a Git repo in the output
folder (that sounds wrong) and push that to Heroku?
Upvotes: 143
Views: 49517
Reputation: 2224
Alternatively, you can use git subtree
to create a heroku
branch on GitHub which you can then deploy to Heroku using a Heroku Button:
Add an app.json
to your server directory, as explained here.
Add the following markdown to README.md
:
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/username/repository/tree/heroku)
Push your changes to the heroku
branch:
git subtree push --prefix server origin heroku
Upvotes: 1
Reputation: 7301
After a long and hard month of trying different things and getting bitten every time I realized,
just because Heroku uses a git repository as a deployment mechanism, you should not treat it as a git repository
it could have been rsync just as well, they went for git, don't get distracted because of this
if you do so, you open up yourself to all kinds of hurt. All of the aforementioned solutions fail miserably somewhere:
bundle deploy
- fail, you need to bundle update every time:path
+ bundle deploy
- fail, the dev team considers :path
option as "you're not using Bundler with this gem option" so it'll not bundle for production/vendor
symlink in development, and actually copy the files for productionThe app in question has 4 projects in git root:
All of the projects have a vendor/common
symlink looking at the root of the common
engine. When compiling source code for deployment to heroku we need to remove the symlink and rsync it's code to physically be in the vendor folder of each separate host.
Works very very nice in the wild with minimal (no?) problems 6 months now
Here's the script https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f
@AdamBuczynski, it's never so straightforward.
1st you will always have a production and test environment at the least - and a bunch of function specific clusters at the worse - suddenly 1 folder needs to map to n heroku projects as a pretty basic requirement and it all needs to be organized somehow so that the script "knows" what source you want to deploy where,
2nd you will want to share code between projects - now comes the sync_common
part, the shennanigans with symlinks in development being replaced by actual rsynced code on Heroku because Heroku requires a certain folder structure and bundler and rubygems really really really make things ugly very badly if you want to extract the common threads into a gem
3rd you will want to plug in CI and it will change a bit how subfolders and git repo need to be organized, in the end in the simplest possible use case you end up with the aforementioned gist.
In other projects I need to plug in Java builds, when selling software to multiple clients you will need to filter modules that get installed depending on the installation requirements and whatnot,
I should really consider exploring bundling things into a Rakefile or something and do everything that way...
Upvotes: 4
Reputation: 3193
I started with what John Berryman put, but actually it can be simpler if you don't care at all about the heroku git history.
cd bin
git init
git add .
git commit -m"deploy"
git push [email protected]:your-project-name.git -f
rm -fr .git
I guess official git subtree
is the best answer, but i had issue getting subtree to work on my mac.
Upvotes: 11
Reputation: 4095
There's an even easier way via git-subtree. Assuming you want to push your folder 'output' as the root to Heroku, you can do:
git subtree push --prefix output heroku master
It appears currently that git-subtree is being included into git-core, but I don't know if that version of git-core has been released yet.
Upvotes: 254
Reputation: 25353
I had a similar issue. In my case it was never a problem to blow away everything in the heroku repository and replace it with whatever is in my subdirectory. If this is your case you can use the following bash script. Just put it in your Rails app directory.
#!/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 [email protected]: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 -
I'm sure there are plenty of ways to improve upon this - so feel free to tell me how!
Upvotes: 9