Working on Moodle with Git is a breeze!
Previously, applying security updates to our Moodle 1.9 site was a ballbreak because we’d changed so much core code. I’d have to go through and apply fixes individually to each updated file to make sure new changes didn’t clash with our custom changes.
We now maintain a forked copy of Moodle on our college’s GitHub account.
Maintaining a copy of Moodle in our own GitHub repository allows us to easily update, manage changes (add our theme, blocks, modules) and contribute bug fixes.
It took me a while to realise that with Git, we can maintain our own version (branch) of Moodle, based on the latest STABLE release. We can keep our added blocks, modules and custom theme separate from STABLE branches. We’re only adding files to our branch and not changing core files, so getting and merging with latest stable updates is easy.
These pages do a great job of explaining Moodle development with Git:
Installing Moodle using Git
- Sign in or create your GitHub account – free for public repositories.
- Download and install Git on your server. Instructions here.
Note: Port 22 (SSH) is blocked and a proxy is used at the College I work at. I followed these steps to use Git on port 443 through our proxy.
- Browse to Moodle’s GitHub repository – https://github.com/moodle/moodle
- Click ‘Fork’ in the top right of the web interface.
- Clone your forked repository locally into a folder on your server. Change ‘username’ below to your GitHub username.
# Clone our fork into a directory called 'moodle' git clone firstname.lastname@example.org:username/moodle.git moodle
- Configure remote repositories.
Add ‘upstream’ to track changes to the official moodle repository.
# Change the active directory in the prompt to the newly cloned 'moodle' directory cd moodle # Assigns the original repo to a remote called 'upstream' git remote add upstream email@example.com:moodle/moodle.git # Pulls in changes not present in your local repository, without modifying your files git fetch upstream # Creates a new branch called MOODLE_23_STABLE # sets it to track the remote branch MOODLE_23_STABLE from the upstream repository git branch --track MOODLE_23_STABLE origin/MOODLE_23_STABLE # show all branches git branch -a # should show: MOODLE_23_STABLE * master remotes/origin/HEAD -> origin/master remotes/origin/MOODLE_13_STABLE remotes/origin/MOODLE_14_STABLE remotes/origin/MOODLE_15_STABLE remotes/origin/MOODLE_16_STABLE remotes/origin/MOODLE_17_STABLE remotes/origin/MOODLE_18_STABLE remotes/origin/MOODLE_19_STABLE remotes/origin/MOODLE_20_STABLE remotes/origin/MOODLE_21_STABLE remotes/origin/MOODLE_22_STABLE remotes/origin/MOODLE_23_STABLE remotes/origin/master remotes/upstream/MOODLE_13_STABLE remotes/upstream/MOODLE_14_STABLE remotes/upstream/MOODLE_15_STABLE remotes/upstream/MOODLE_16_STABLE remotes/upstream/MOODLE_17_STABLE remotes/upstream/MOODLE_18_STABLE remotes/upstream/MOODLE_19_STABLE remotes/upstream/MOODLE_20_STABLE remotes/upstream/MOODLE_21_STABLE remotes/upstream/MOODLE_22_STABLE remotes/upstream/MOODLE_23_STABLE remotes/upstream/master # switch to the latest stable branch git checkout MOODLE_23_STABLE
New branch for your changes
After you’ve switched to MOODLE_23_STABLE you can create a new branch to store any changes you want to make to your chosen STABLE version.
# creates a branch called conel-MOODLE_23_STABLE, based on 2.3 STABLE git checkout -b conel-MOODLE_23_STABLE
In this example I create a new branch called conel-MOODLE_23_STABLE that will contain our added modules, blocks and custom theme.
After we’ve added files to our local copy of Moodle we want to push these to our conel-MOODLE_23_STABLE branch.
# Adds our changed files git add . git commit -m 'add blocks, modules, theme' # Push your changes to conel-MOODLE_23_STABLE git push origin conel-MOODLE_23_STABLE
With Git, I simply fetch the latest updates from the Moodle repository (upstream), push them to my copy of moodle (origin), pull down the latest changes locally to my server, then merge them with conel-MOODLE_23_STABLE. Because conel-MOODLE_23_STABLE mostly contains new code (avoiding core changes as much as possible) I’ve yet to experience a merge conflict.
Here’s the (currently manual) process of getting the latest Moodle changes into our forked copy.
git fetch upstream git push origin refs/remotes/upstream/MOODLE_22_STABLE:MOODLE_22_STABLE git push origin refs/remotes/upstream/MOODLE_23_STABLE:MOODLE_23_STABLE git push origin refs/remotes/upstream/master:master # In branch conel-MOODLE_23_STABLE git checkout MOODLE_23_STABLE git pull git checkout conel-MOODLE_23_STABLE git merge MOODLE_23_STABLE
Notification of Updates
GitHub provides a handy feed of commits to any branch/master.
You can easily subscribe to Moodle commits for any branch you want. At work I use Outlook 2010 to subscribe to MOODLE_22_STABLE and MOODLE_23_STABLE.
The Git for Administrators page says, “The Moodle development team performs integration and testing of fixed bugs every Monday and Tuesday. On Wednesday you can install all patches by updating your code”.
I find this visual reminder useful. I’ve added this feed to my favourites so it’s prominent in Outlook.