New to Git? Learn it in 15 minutes here.

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

  1. Sign in or create your GitHub account – free for public repositories.
  2. 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.
  3. Browse to Moodle’s GitHub repository – https://github.com/moodle/moodle
  4. Click ‘Fork’ in the top right of the web interface.
  5. 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 git@github.com:username/moodle.git moodle
  6. 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 git@github.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

Updating Moodle

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.