views:

417

answers:

1

Hi All,

I am new to the world of Git, GitHub and Heroku. So far, I am enjoying this paradigm but coming from a background with SVN, things seems a bit complicated to me in the world of Git. I am facing a problem for which I am looking for a solution.

Scenario:

1. I have setup a new private project on GitHub. I forked the private project and now I have the following structure in my branch:

    /project
      /apps
        /my-apps
          /my-app-1
            ....
          /my-app-2
            ....
          /your-apps
            /your-app-1
              ....
            /your-app-2
              ....
      /plugins
         ....

I can commit the code in my Fork on GitHub from my machine in any of the folders I want. Later on, these would be pulled into the master repository by the admin of the project.

2. For every individual application in the apps folder, I have setup an app on Heroku which is a Git Repo in itself where I push my changes when I am done with the user stories from my local machine. In short, every app in the apps folder is a Rails App hosted on Heroku.

Problem:

What I want is that when I push my changes into Heroku, they can be committed into my project fork on GitHub as well, so, it also has the latest code all the time.

The issue I see is that the code on Heroku is a Git Repo while the folders which I have on GitHub are part of a Repo.

So far, what I have researched is that there is something known as Submodule in the Git World which can come to the rescue, however, I have not been able to find some newbie instructions.

Can someone in the community be kind enough to share thoughts and help me to identify the solution of this problem?

+4  A: 

The idea behind submodules is that they're all separate git repositories that you can include into a master one and rather instead of including all the files it includes a link to that submodule instead.

How to use submodules

To use a submodule, first you must extract out the directory and create it as its own git repository by using git init. Then you can upload this separately to Github or [place of your choosing] and to use it as a submodule use the command: git submodule add [place/to/put/it] git://github.com/you/proj1.

Separation is best

I would think it better to leave these separated out as their own git repositories and push to heroku from each one. The reason? It's more likely (I feel) that you're going to be working on one at a time and doing a git commit and git push heroku master for that one only.

If you wished however to deploy all applications at the same time you could recurse down the directory tree using this Ruby script placed in the top-level directory:

Dir["**/*"].select { |dir| File.directory?(dir) }.each do |f|
  Dir.chdir(dir) do
    `git push origin master`
    `git push heroku master`
  end
end

Of course this would only work if you have staged all your changes. I can't think of a way to automate that as Ruby <= 1.9 doesn't have the module to read your thoughts.

Ryan Bigg
Thanks for your reply Ryan. As you mentioned, submodules needs to be created, however, I want to know if every submodule needs to be hosted separately on GitHub or it can reside in the project repository as well.
Haseeb Khan
Host them separately would be the best way imo.
Ryan Bigg
Basically, we don't want to host these separately, the main reason is that the repositories are not public and thus we don't want to share with everyone. Also, hosting private repositories on GitHub costs money.
Haseeb Khan