Using git-submodule to handle plugins
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 checkout your_local_branch
git rebase master
... solve posslble merge-conflicts ...
git checkout master
git merge your_local_branch
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: