Note: You are currently viewing documentation for Moodle 3.0. Up-to-date documentation for the latest stable version of Moodle may be available here: Git for Administrators.

Git for Administrators: Difference between revisions

From MoodleDocs
 
(46 intermediate revisions by 23 users not shown)
Line 1: Line 1:
An alternative way to maintaining your Moodle server via [[CVS for Administrators|CVS]] is using Git. This page describes how to maintain a copy of Moodle on your production server which can easily be upgraded using Git. If you have customisations of Moodle core code, you are advised to follow the instructions in the [[Development:Quick Git start guide for Moodle development|Quick Git start guide for Moodle development]].
{{Installing Moodle}}
This page describes how to maintain a copy of Moodle on your production server which can easily be upgraded using Git. If you have customisations of Moodle core code, you are advised to follow the instructions in the [[:dev:Git for developers|Git for developers guide]].
 
To get the most of Git it is worth making the effort to understand its basic concepts - see the section below. It can be a bit of a steep learning curve, especially if you are used to CVS or Subversion.
 
== Getting hold of Git (Windows, OSX, Linux and others) ==
 
Support for Git was, up until recently, mostly confined to Linux but builds are now available for most popular operating systems:
 
* List of downloads from Git site - http://git-scm.com/download
 
Once you have downloaded and installed your OS relevant git installation, the git commands in this document should work with your operating system.


== Obtaining the code from Git ==
== Obtaining the code from Git ==
The command line version of Git is discussed here. Graphical clients are little more than wrappers around the command line version, so you should be able to deduce the correct parameters quite easily.


You can find the official Moodle git repository at git://git.moodle.org/moodle.git (with an official clone at git://github.com/moodle/moodle.git). To initialize your local checkout, use
You can find the official Moodle git repository at git://git.moodle.org/moodle.git (with an official clone at git://github.com/moodle/moodle.git). To initialize your local checkout, use
<pre>
$ cd /path/to/your/webroot
$ git clone git://git.moodle.org/moodle.git                      (1)
$ cd moodle
$ git branch -a                                                  (2)
$ git branch --track MOODLE_30_STABLE origin/MOODLE_30_STABLE    (3)
$ git checkout MOODLE_30_STABLE                                  (4)
</pre>
* The command (1) initializes the new local repository as a clone of the 'upstream' (i.e. the remote server based) moodle.git repository. The upstream repository is called 'origin' by default. It creates a new directory named ''moodle'', where it downloads all the files. This operation can take a while as it is actually getting the entire history of all Moodle versions
* The command (2) lists all available branches.
* Use the command (3) to create a new local branch called MOODLE_30_STABLE and set it to track the remote branch MOODLE_30_STABLE from the upstream repository.
* The command (4) actually switches to the newly created local branch.


    git clone git://git.moodle.org/moodle.git                      (1)
Note that Git has a huge number of options for each command and it's actually possible to do the above process with a single command (left as an exercise!!).
    cd moodle
    git branch -a                                                   (2)
    git branch --track local_21_STABLE origin/MOODLE_21_STABLE      (3)
    git checkout local_21_STABLE                                    (4)


* The command (1) initializes the new local repository as a clone of the upstream moodle.git repository, known as the ''origin'' remote repository by default. It creates a new directory named ''moodle'', where it downloads all the files. This operation can take a while.
==Git from behind a firewall==
* The command (2) lists all available branches.
 
* Use the command (3) to create a new local branch called local_21_STABLE and set it to track the branch MOODLE_21_STABLE from the upstream repository.
Git uses a read-only protocol that may be blocked by your firewall (port 9418). If this is a problem, you can use Github's http version <nowiki>https://github.com/moodle/moodle.git</nowiki>. It's a bit slower, so use the Git protocol if you can.
* The command (4) actually switches to the newly created local branch. Note that the last two lines can be replaced with
 
== Updating your installation ==
 
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. Check the [http://git.moodle.org/gw?p=moodle.git;a=summary shortlog] to see if the official repository has been already updated or not.
 
To update your code to the latest version (on the MOODLE_30_STABLE branch) '''all''' you have to do is:
<pre>
$ cd /path/to/your/moodle/
$ git pull
</pre>
If this is a production site you should still consider the [[Upgrade]] instructions (e.g. take backups).
 
== Installing a contributed extension from its Git repository ==


    git checkout -b --track local_21_STABLE origin/MOODLE_21_STABLE        (3 + 4)
This is one way to handle adding plugins from other Git repositories into your Moodle repository. Another way is to use Git Submodules. However, at the time of writing, this is one of Git's rougher features and should be regarded as an advanced option.


that creates a new local tracking branch and switches to it immediately.
For example, let us say we want to install the [[Certificate module]] from its Git repository into our Moodle 3.0.
<pre>
$ cd /path/to/your/moodle/
$ cd mod                                                          (1)
$ git clone https://github.com/markn86/moodle-mod_certificate.git certificate    (2)
$ cd certificate
$ git checkout -b MOODLE_30_STABLE origin/MOODLE_30_STABLE        (3)
$ git branch -d master                                            (4)
</pre>
The command (1) changes the current directory into the ''mod'' folder of your local Moodle clone. The command (2) creates a new subdirectory ''certificate'' and makes a local clone of vanilla Certificate repository. The command (3) creates a new local branch that will track the remote branch with a Certificate version for Moodle 3.0. The command (4) deletes the ''master'' that was created automatically by git-clone in (2) as we do not want it in this production checkout.


The ''master'' local branch, automatically created by git-clone, can then be deleted with the command
Note: you should check first the compatibility of a module with your Moodle branch by asking directly to the Maintainer before cloning the repo or - if you want to guess it - by issuing the command below before running the command (3), in order to verify what is available among the branches:
<pre>
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/MOODLE_20_STABLE
  remotes/origin/MOODLE_21_STABLE
  remotes/origin/MOODLE_22_STABLE
  remotes/origin/MOODLE_23_STABLE
  remotes/origin/MOODLE_24_STABLE
  remotes/origin/MOODLE_25_STABLE
  remotes/origin/MOODLE_26_STABLE
  remotes/origin/MOODLE_27_STABLE
  remotes/origin/MOODLE_28_STABLE
  remotes/origin/MOODLE_29_STABLE
  remotes/origin/MOODLE_30_STABLE
  remotes/origin/master
</pre>
This will avoid an error message when you issue the command (3) against a nonexistent branch, e.g.:
<pre>
§ git checkout -b MOODLE_30_STABLE origin/MOODLE_30_STABLE
fatal: git checkout: updating paths is incompatible with switching branches.
Did you intend to checkout 'origin/MOODLE_30_STABLE' which can not be resolved as commit?
</pre>


    git branch -d master
Now it is wise to add the new directory mod/certificate/ to the list of ignored files of the main Moodle clone, otherwise a status of the main clone will keep reminding you that the new code has not been checked in.
<pre>
$ cd /path/to/your/moodle/
$ echo /mod/certificate/ >> .git/info/exclude
</pre>
To update your Moodle installation now, you must visit both Git repositories and pull changes from upstream.
<pre>
$ cd /path/to/your/moodle/
$ git pull
$ cd mod/certificate
$ git pull
</pre>
Writing a shell script with these lines in the root of Moodle installation is a very good idea. Otherwise it is easy to forget what Git repositories are there within the main Moodle repository.


== Updating your installation ==
== Installing and maintaining contributed extensions using Git submodules ==


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. Check the [http://git.moodle.org/gw?p=moodle.git;a=summary shortlog] to see if the official repository has been already updated or not.
As it was said in the previous section, this is for advanced users only.
Therefore it is necessary, that you have some experience with Git and its commands.
A step-by-step explanation will be provided, but in order to follow these steps it is helpful to understand, what these commands do.


    cd /path/to/your/moodle/checkout
Advanced options and commands can be found at [[https://git-scm.com/book/en/v2/Git-Tools-Submodules|the Git book]].
    git fetch                                                      (1)
If you have any questions about Git submodules, please visit the site above first.
    git status                                                      (2)
    git merge                                                      (3)


The command (1) downloads new updates from the remote repository without touching your local checkout. The command (2) displays the information about the eventual drift between you local version and the upstream one. The command (3) actually modifies your local files with the updates. The git-fetch + git-merge couple can be replaced with a single command
=== Installing a new extension into an existing Moodle ===


    git pull                                                        (1 + 3)
As an example we use the [[Certificate module]] from the previous section.
<pre>
$ cd /path/to/your/moodle
$ git submodule add https://github.com/markn86/moodle-mod_certificate.git mod/certificate
</pre>


== Installing a contributed extension from its Git repository ==
Note, that Git is reporting two new files in the repository:
<pre>
$ git status
# On branch MOODLE_29_STABLE
# Changes to be committed:
#  (use "git reset HEAD <file>..." to unstage)
#
# new file:  .gitmodules
# new file:  mod/certificate
#
</pre>


For example, let us say we want to install the [[Book module]] form its Git repository into our Moodle 2.1.
The file '''.gitmodules''' contains the local path and url of all your submodules.
It has to be commited, if you intend to clone the repository later (see the page [[Moodle development environment with Git submodules]]).
Before commiting, make sure to check the configuration of the plugin's Git repository, since the automatically generated settings may be not sufficient.
For future updates it is helpful, to track the remote branch, which corresponds to the Moodle version of your repository.
<pre>
$ cd mod/certificate
$ git branch -avv
* master                          345f5b1 [origin/master] Replaced deprecated function
  remotes/origin/HEAD            -> origin/master
  remotes/origin/MOODLE_20_STABLE 1aa1040 Added option to print 'grade category' grade
  remotes/origin/MOODLE_21_STABLE 1aa1040 Added option to print 'grade category' grade
  remotes/origin/MOODLE_22_STABLE 1aa1040 Added option to print 'grade category' grade
  remotes/origin/MOODLE_23_STABLE fe047de Check that the function exists rather than relying on the Moodle version
  remotes/origin/MOODLE_24_STABLE 1051f7d CONTRIB-4892 Fixed the email to others functionality
  remotes/origin/MOODLE_25_STABLE cdb221a CONTRIB-4946: Removed character from language file breaking AMOS
  remotes/origin/MOODLE_26_STABLE 696802a Increased version
  remotes/origin/MOODLE_27_STABLE d3c0379 Increased version
  remotes/origin/MOODLE_28_STABLE fa8df83 Increased version
  remotes/origin/MOODLE_29_STABLE 3f03740 Replaced deprecated function
  remotes/origin/master          345f5b1 Replaced deprecated function
</pre>


    cd /path/to/your/moodle/checkout
Git created the branch '''master''' which tracks '''origin/master''' automatically, because the remote repository has checked out '''master'''.
    cd mod                                                          (1)
Therefore, create a new branch, which tracks the appropriate remote branch.
    git clone git://github.com/skodak/moodle-mod_book.git book      (2)
Of course, this is only possible, if the remote repository offers those branches.  
    cd book
<pre>
    git checkout -b MOODLE_21_STABLE origin/MOODLE_21_STABLE        (3)
$ git checkout -b MOODLE_29_STABLE origin/MOODLE_29_STABLE
    git branch -d master                                           (4)
Branch MOODLE_29_STABLE set up to track remote branch MOODLE_29_STABLE from origin.
Switched to a new branch 'MOODLE_29_STABLE'
$ git branch -D master
Deleted branch master (was 345f5b1).
</pre>
It is not necessary to delete the '''master''' branch, but it's useless to keep it.
In fact, these settings don't need to be touched afterwards.


The command (1) changes the current directory into the ''mod'' folder of your local Moodle clone. The command (2) creates a new subdirectory ''book'' and makes a local clone of Petr Škoda's vanilla Book repository. The command (3) creates a new local branch that will track the remote branch with a Book version for Moodle 2.0. The command (4) deletes the ''master'' that was created automatically by git-clone in (2) as we do not want it in this production checkout.
The final step is to commit the changes to the main repository.
<pre>
$ cd /path/to/your/moodle
$ git commit -a -m "New extension mod_certificate installed"
</pre>


Now it is wise to put the new directory mod/book/ to the list of ignored files of the main Moodle clone.
It has to be ensured, that the commit includes only the changes for the new Git submodule (since '''-a''' commits all non-staged changes).


    cd /path/to/your/moodle/checkout
=== Maintaining Git submodules on a single project ===
    echo /mod/book/ >> .git/info/exclude


To update your Moodle installation now, you must visit both Git repositories and pull changes from upstream.
Maintaining a set of submodules is extremly easy.
Consider a Moodle repository with several submodules installed.
Keep in mind, that the extension '''mod_mylittleextension''' is a fake plugin, created for a test scenario in this example.
It is not an official Moodle module. For updating all your submodules at once, type in:
<pre>
$ cd /path/to/your/moodle
$ git submodule foreach git pull
Entering 'block/coursefeedback'
Already up-to-date.
Entering 'mod/certificate'
Already up-to-date.
Entering 'mod/mylittleextension'
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From /local/repositories/mle
  89d9eae..64c122d  master    -> origin/master
Updating 89d9eae..64c122d
Fast-forward
index.html  |    9 +++++++++
version.php |    6 +++---
2 files changed, 12 insertions(+), 3 deletions(-)
create mode 100644 index.html
$ git status
# On branch MOODLE_29_STABLE
# Changes not staged for commit:
#  (use "git add <file>..." to update what will be committed)
#  (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified:  mod/mylittleextension (new commits)
#
</pre>


    cd /path/to/your/moodle/checkout
The command '''git submodule foreach [another command]''' walks through all submodule repositiories and executes what is specified by '''[another command]'''.
    git pull
In this case it is '''git pull'''.
    cd /path/to/your/moodle/checkout/mod/book
Therefore the module mylittleextension was updated and the main repository isn't clean anymore until changes are committed:
    git pull
<pre>
$ git commit -a -m "Plugin updates"
</pre>


Writing a shell script with these lines in the root of Moodle installation is a very good idea. Otherwise it is easy to forget what Git repositories are there within the main Moodle repository.
Maintaining plugins with Git submodules has also another application than simplyfying the update process.
In a greater scale it can be used to maintain a Moodle project, where multiple developers need to have an exact copy of your moodle without organizing external plugins manually.
You can read more about this topic at the page [[Moodle development environment with Git submodules]].


== See also ==
== See also ==


; Moodle Docs
* [[Windows installation using Git]]
* [[Git FAQ]]
* [[Git for Mac]]
* [[CVS for Administrators]]
* [[:dev:Moodle versions]]
* [[Moodle versions]]
* For fixing a Tracker Issue (MDL) / Forking Moodle / CONTRIButing code [[:dev:User:Sam_Hemelryk/My_Moodle_Git_workflow|User:Sam_Hemelryk/My_Moodle_Git_workflow]]
* For some screenshots see [[User:Frank_Ralf/Git]] (still work in progress)
* [[Moodle_Production_Server_with_GIT|Case study Git + Moodle from Technical University Berlin]]


; Moodle forum discussions
; Moodle forum discussions
* [https://moodle.org/mod/forum/discuss.php?d=255175 Github and Moodle deployment for production]
* [http://moodle.org/mod/forum/discuss.php?d=168094 GIT help needed]
* [http://moodle.org/mod/forum/discuss.php?d=168094 GIT help needed]
* [http://moodle.org/mod/forum/discuss.php?d=165236 Best way to manage CONTRIB code with GIT]
* [https://moodle.org/mod/forum/discuss.php?d=231046 Clear git guide for Admins (not developers)]
* [http://moodle.org/mod/forum/discuss.php?d=167063 Handy Git tip for tracking 3rd-party modules and plugins]
* [http://moodle.org/mod/forum/discuss.php?d=167730 Moodle Git repositories]
* [http://moodle.org/mod/forum/discuss.php?d=183693 Git and CVS]


; External resources  
; External resources  
* [http://www.kernel.org/pub/software/scm/git/docs/everyday.html Everyday GIT With 20 Commands Or So]
* [http://thamblings.blogspot.com.au/2013/07/upgrading-moodle-from-git.html Deploying Moodle from git - Blog post from a production experience]
* [http://gitref.org/ Git Reference]
* [http://gitref.org/ Git Reference]
* [http://progit.org/book/ Pro Git book]
* [http://progit.org/book/ Pro Git book]
[[Category:Git]]
[[Category:Administrator]]


[[ja:管理者用Git]]
[[ja:管理者用Git]]
[[fr:Git_pour_administrateurs]]
[[es:Git para Administradores]]

Latest revision as of 09:15, 13 May 2016

This page describes how to maintain a copy of Moodle on your production server which can easily be upgraded using Git. If you have customisations of Moodle core code, you are advised to follow the instructions in the Git for developers guide.

To get the most of Git it is worth making the effort to understand its basic concepts - see the section below. It can be a bit of a steep learning curve, especially if you are used to CVS or Subversion.

Getting hold of Git (Windows, OSX, Linux and others)

Support for Git was, up until recently, mostly confined to Linux but builds are now available for most popular operating systems:

Once you have downloaded and installed your OS relevant git installation, the git commands in this document should work with your operating system.

Obtaining the code from Git

The command line version of Git is discussed here. Graphical clients are little more than wrappers around the command line version, so you should be able to deduce the correct parameters quite easily.

You can find the official Moodle git repository at git://git.moodle.org/moodle.git (with an official clone at git://github.com/moodle/moodle.git). To initialize your local checkout, use

$ cd /path/to/your/webroot
$ git clone git://git.moodle.org/moodle.git                       (1)
$ cd moodle
$ git branch -a                                                   (2)
$ git branch --track MOODLE_30_STABLE origin/MOODLE_30_STABLE     (3)
$ git checkout MOODLE_30_STABLE                                   (4)
  • The command (1) initializes the new local repository as a clone of the 'upstream' (i.e. the remote server based) moodle.git repository. The upstream repository is called 'origin' by default. It creates a new directory named moodle, where it downloads all the files. This operation can take a while as it is actually getting the entire history of all Moodle versions
  • The command (2) lists all available branches.
  • Use the command (3) to create a new local branch called MOODLE_30_STABLE and set it to track the remote branch MOODLE_30_STABLE from the upstream repository.
  • The command (4) actually switches to the newly created local branch.

Note that Git has a huge number of options for each command and it's actually possible to do the above process with a single command (left as an exercise!!).

Git from behind a firewall

Git uses a read-only protocol that may be blocked by your firewall (port 9418). If this is a problem, you can use Github's http version https://github.com/moodle/moodle.git. It's a bit slower, so use the Git protocol if you can.

Updating your installation

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. Check the shortlog to see if the official repository has been already updated or not.

To update your code to the latest version (on the MOODLE_30_STABLE branch) all you have to do is:

$ cd /path/to/your/moodle/
$ git pull

If this is a production site you should still consider the Upgrade instructions (e.g. take backups).

Installing a contributed extension from its Git repository

This is one way to handle adding plugins from other Git repositories into your Moodle repository. Another way is to use Git Submodules. However, at the time of writing, this is one of Git's rougher features and should be regarded as an advanced option.

For example, let us say we want to install the Certificate module from its Git repository into our Moodle 3.0.

$ cd /path/to/your/moodle/
$ cd mod                                                          (1)
$ git clone https://github.com/markn86/moodle-mod_certificate.git certificate     (2)
$ cd certificate
$ git checkout -b MOODLE_30_STABLE origin/MOODLE_30_STABLE        (3)
$ git branch -d master                                            (4)

The command (1) changes the current directory into the mod folder of your local Moodle clone. The command (2) creates a new subdirectory certificate and makes a local clone of vanilla Certificate repository. The command (3) creates a new local branch that will track the remote branch with a Certificate version for Moodle 3.0. The command (4) deletes the master that was created automatically by git-clone in (2) as we do not want it in this production checkout.

Note: you should check first the compatibility of a module with your Moodle branch by asking directly to the Maintainer before cloning the repo or - if you want to guess it - by issuing the command below before running the command (3), in order to verify what is available among the branches:

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/MOODLE_20_STABLE
  remotes/origin/MOODLE_21_STABLE
  remotes/origin/MOODLE_22_STABLE
  remotes/origin/MOODLE_23_STABLE
  remotes/origin/MOODLE_24_STABLE
  remotes/origin/MOODLE_25_STABLE
  remotes/origin/MOODLE_26_STABLE
  remotes/origin/MOODLE_27_STABLE
  remotes/origin/MOODLE_28_STABLE
  remotes/origin/MOODLE_29_STABLE
  remotes/origin/MOODLE_30_STABLE
  remotes/origin/master

This will avoid an error message when you issue the command (3) against a nonexistent branch, e.g.:

§ git checkout -b MOODLE_30_STABLE origin/MOODLE_30_STABLE
fatal: git checkout: updating paths is incompatible with switching branches.
Did you intend to checkout 'origin/MOODLE_30_STABLE' which can not be resolved as commit?

Now it is wise to add the new directory mod/certificate/ to the list of ignored files of the main Moodle clone, otherwise a status of the main clone will keep reminding you that the new code has not been checked in.

$ cd /path/to/your/moodle/
$ echo /mod/certificate/ >> .git/info/exclude

To update your Moodle installation now, you must visit both Git repositories and pull changes from upstream.

$ cd /path/to/your/moodle/
$ git pull
$ cd mod/certificate
$ git pull

Writing a shell script with these lines in the root of Moodle installation is a very good idea. Otherwise it is easy to forget what Git repositories are there within the main Moodle repository.

Installing and maintaining contributed extensions using Git submodules

As it was said in the previous section, this is for advanced users only. Therefore it is necessary, that you have some experience with Git and its commands. A step-by-step explanation will be provided, but in order to follow these steps it is helpful to understand, what these commands do.

Advanced options and commands can be found at [Git book]. If you have any questions about Git submodules, please visit the site above first.

Installing a new extension into an existing Moodle

As an example we use the Certificate module from the previous section.

$ cd /path/to/your/moodle
$ git submodule add https://github.com/markn86/moodle-mod_certificate.git mod/certificate

Note, that Git is reporting two new files in the repository:

$ git status
# On branch MOODLE_29_STABLE
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	new file:   .gitmodules
#	new file:   mod/certificate
#

The file .gitmodules contains the local path and url of all your submodules. It has to be commited, if you intend to clone the repository later (see the page Moodle development environment with Git submodules). Before commiting, make sure to check the configuration of the plugin's Git repository, since the automatically generated settings may be not sufficient. For future updates it is helpful, to track the remote branch, which corresponds to the Moodle version of your repository.

$ cd mod/certificate
$ git branch -avv
* master                          345f5b1 [origin/master] Replaced deprecated function
  remotes/origin/HEAD             -> origin/master
  remotes/origin/MOODLE_20_STABLE 1aa1040 Added option to print 'grade category' grade
  remotes/origin/MOODLE_21_STABLE 1aa1040 Added option to print 'grade category' grade
  remotes/origin/MOODLE_22_STABLE 1aa1040 Added option to print 'grade category' grade
  remotes/origin/MOODLE_23_STABLE fe047de Check that the function exists rather than relying on the Moodle version
  remotes/origin/MOODLE_24_STABLE 1051f7d CONTRIB-4892 Fixed the email to others functionality
  remotes/origin/MOODLE_25_STABLE cdb221a CONTRIB-4946: Removed character from language file breaking AMOS
  remotes/origin/MOODLE_26_STABLE 696802a Increased version
  remotes/origin/MOODLE_27_STABLE d3c0379 Increased version
  remotes/origin/MOODLE_28_STABLE fa8df83 Increased version
  remotes/origin/MOODLE_29_STABLE 3f03740 Replaced deprecated function
  remotes/origin/master           345f5b1 Replaced deprecated function

Git created the branch master which tracks origin/master automatically, because the remote repository has checked out master. Therefore, create a new branch, which tracks the appropriate remote branch. Of course, this is only possible, if the remote repository offers those branches.

$ git checkout -b MOODLE_29_STABLE origin/MOODLE_29_STABLE
Branch MOODLE_29_STABLE set up to track remote branch MOODLE_29_STABLE from origin.
Switched to a new branch 'MOODLE_29_STABLE'
$ git branch -D master
Deleted branch master (was 345f5b1).

It is not necessary to delete the master branch, but it's useless to keep it. In fact, these settings don't need to be touched afterwards.

The final step is to commit the changes to the main repository.

$ cd /path/to/your/moodle
$ git commit -a -m "New extension mod_certificate installed"

It has to be ensured, that the commit includes only the changes for the new Git submodule (since -a commits all non-staged changes).

Maintaining Git submodules on a single project

Maintaining a set of submodules is extremly easy. Consider a Moodle repository with several submodules installed. Keep in mind, that the extension mod_mylittleextension is a fake plugin, created for a test scenario in this example. It is not an official Moodle module. For updating all your submodules at once, type in:

$ cd /path/to/your/moodle
$ git submodule foreach git pull
Entering 'block/coursefeedback'
Already up-to-date.
Entering 'mod/certificate'
Already up-to-date.
Entering 'mod/mylittleextension'
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From /local/repositories/mle
   89d9eae..64c122d  master     -> origin/master
Updating 89d9eae..64c122d
Fast-forward
 index.html  |    9 +++++++++
 version.php |    6 +++---
 2 files changed, 12 insertions(+), 3 deletions(-)
 create mode 100644 index.html
$ git status
# On branch MOODLE_29_STABLE
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   mod/mylittleextension (new commits)
#

The command git submodule foreach [another command] walks through all submodule repositiories and executes what is specified by [another command]. In this case it is git pull. Therefore the module mylittleextension was updated and the main repository isn't clean anymore until changes are committed:

$ git commit -a -m "Plugin updates"

Maintaining plugins with Git submodules has also another application than simplyfying the update process. In a greater scale it can be used to maintain a Moodle project, where multiple developers need to have an exact copy of your moodle without organizing external plugins manually. You can read more about this topic at the page Moodle development environment with Git submodules.

See also

Moodle forum discussions
External resources