68

I have a multi-module app that is already on Github. It is comprised of two modules, one of them an Android app and the other a Rails based Web app. So my project's directory structure is in the form of:

ProjectRoot
|
+-- web
|
+-- android
|
+-- .git

As such I cannot simply cd into ProjectRoot and push my app to Heroku as the root folder of the Rails app is ProjectRoot/web. Is there a way to push the web folder to Heroku? If I turn web into a git sub module, it should be easy to accomplish this, but then I only have 5 private repos on Git and I prefer to consume only 1 repo for my whole app.

the_drow
  • 18,571
  • 25
  • 126
  • 193
Behrang
  • 46,888
  • 25
  • 118
  • 160
  • Possible duplicate of [How can I deploy/push only a subdirectory of my git repo to Heroku?](https://stackoverflow.com/questions/7539382/how-can-i-deploy-push-only-a-subdirectory-of-my-git-repo-to-heroku) – r g Apr 14 '19 at 08:44

3 Answers3

91

You can use git subtree push. It will generate a new commit tree with your directory as root, and push it.

git subtree push --prefix web heroku master

Full documentation is here.

Michaël Witrant
  • 7,525
  • 40
  • 44
  • This works great. What if you want to push a specific tag or branch in combination with subtree? Like 'git push heroku yourbranch:master'? – stian Oct 12 '12 at 07:06
  • 6
    In this case you cannot use the `subtree push` shortcut and have to chain commands youself. For example: `git push heroku \`git subtree split --prefix web yourbranch\`:master` – Michaël Witrant Oct 12 '12 at 17:58
  • 15
    FYI, `git subtree` is now part of core git (no need to install anything as long as you're git version is current) – Mario Zigliotto Aug 17 '14 at 20:21
21

The git subtree command (built in, now) is a good way to do this. If you want to push a subtree of a branch to become your master, you can use something like:

git push --force heroku `git subtree split --prefix web HEAD`:master

brookr
  • 1,504
  • 12
  • 14
4

You could also use git branches instead of subfolders. If you have git 1.7.2 or newer, you can simply do git checkout --orphan android to create a branch that is disconnected from your master branch (assumed here to be the web folder). Once you have checked out the orphan branch, run git rm -rf . to remove existing files before copying in your android-specific files to the now empty root directory.

If you want to use separate folders for each module, you can clone the repository twice and use this structure:

ProjectRoot
├── android
│   └── .git
└── web
    └── .git
bmaland
  • 71
  • 2