Using git-submodule can make it very easy for you to work with plugins in your rails projects. I will try to show you this, in an easy step-by-step manner.

To start, make a plugin-project, call it your_plugin, in its own folder, and push the code to git.
Your standard commands apply, as for any project:

  • git status : what is changed?
  • git add . : add the newly added files to your git-repository
  • git commit -am "a meaningful message" : commit your changes in your local repository
  • git push origin master : push your local changes to the remote master (origin/master)

How can you add the plugin as a submodule to your rails project?
Navigate to the root of your rails project, and execute the following commands:

git submodule add git://your_repository vendor/plugins/your_plugin_name
git submodule init
git submodule update
git status # will show the difference: only the submodule is added
git commit -a -m "added plugin your-plugin-name"

How do you retrieve the lastest version of a submodule/plugin. A submodule in git is coupled to the git-repository at a specific time, so it does not automatically evolve with the remote versions of your pluging. You have to manually make a few operations, to make sure you are using the latest version. In my opinion this is an advantage, as you can keep using a known working version until you really want to upgrade.

To update your submodule, go to the root of your plugin/submodule (normally RAILS_ROOT/vendor/plugins/your-plugin-name), and execute the following commands:

git remote update          # since your submodule is actually a git repository on its own, you can do this
git merge origin/master  # retrieve the remote master version
cd ..\..\..                      # back to RAILS_ROOT
git status                      # your submodule is updated to the latest version

Now to edit and change the plugin/submodule, it is the easiest to work inside the plugin folder itself.
To do so, you have to proceed as follows.

Inside the root of your plugin (e.g. @\vendor\plugins\your-plugin@)

git checkout -b your_local_branch
... do some changes
git commit -a -m "something changed"
git checkout master
git pull
git checkout your_local_branch
git rebase master
... solve posslble merge-conflicts ...
git checkout master
git merge your_local_branch
git push

then cd to RAILS_ROOT

git status  # => your plugin will have changed
git commit -a -m "improved plugin"

I used the following sources for inspiration: