Git per Amministratori

Attenzione: Pagina in costruzione


Questa pagina descrive come mantenere sul server di produzione una copia di Moodle facilmente aggiornabile via Git. Se si dispone di personalizzazioni del codice di base Moodle, si consiglia di seguire le istruzioni della (EN) Guida Git per sviluppatori.

Per ottenere il massimo da Git vale la pena comprendere i suoi concetti di base anche se può essere una curva di apprendimento un po' ripida, specialmente se si è abituati a CVS o Subversion.

Ottenere Git (Windows, OSX, Linux e altri)

Il supporto per Git era, fino a poco tempo fa, limitato principalmente a Linux, ma le build sono ora disponibili per i sistemi operativi più popolari (consultare l'(EN) elenco dei download dal sito Git). Dopo aver scaricato e installato Git per il proprio sistema operativo, i comandi git in questo documento dovrebbero funzionare correttamente.

Ottenere il codice da Git

La versione da riga di comando di Git è discussa qui. I client grafici sono poco più di wrapper attorno alla versione da riga di comando, quindi si possono dedurre abbastanza facilmente i parametri corretti.

Il repository git ufficiale di Moodle è disponibile su git://git.moodle.org/moodle.git, con un clone ufficiale su git://github.com/moodle/moodle.git. Per inizializzare il checkout locale, utilizzare:

$ cd /path/to/your/webroot
$ git clone git://git.moodle.org/moodle.git                       (1)
$ cd moodle
$ git branch -a                                                   (2)
$ git branch --track MOODLE_35_STABLE origin/MOODLE_35_STABLE     (3)
$ git checkout MOODLE_35_STABLE                                   (4)
  • Il comando (1) inizializza il nuovo repository locale come clone del repository moodle.git upstream (cioè il server remoto). Il repository upstream è chiamato 'origine' per impostazione predefinita e crea una nuova directory chiamata moodle, dove scarica tutti i file. Poiché sta recuperando l'intera cronologia di tutte le versioni di Moodle, questa operazione può richiedere un po' di tempo.
  • Il comando (2) elenca tutti i rami disponibili.
  • Utilizzare il comando (3) per creare un nuovo ramo locale chiamato MOODLE_35_STABLE e impostarlo per tracciare il ramo remoto MOODLE_35_STABLE dal repository upstream.
  • Il comando (4) si sposta sul ramo locale appena creato.

Errore: Git Connection Refused

  • Se la connessione è stata rifiutata, utilizzare:
$ git clone https://github.com/moodle/moodle.git
''fatal: unable to connect to git.moodle.org:
git.moodle.org[0: 34.210.133.53]: errno=Connection refused''
Nota: Git ha un enorme numero di opzioni per ogni comando ed è effettivamente possibile eseguire il processo di cui sopra con un singolo comando (provare come esercizio).

Git da dietro un firewall

Git utilizza un protocollo di sola lettura che può essere bloccato dal firewall (porta 9418). Se rappresenta un problema, si può utilizzare la versione http di Github (EN) https://github.com/moodle/moodle. Poiché più lento, se possibile utilizzare il protocollo Git.

Aggiornare l'installazione

Il team di sviluppo di Moodle esegue l'integrazione e il test dei bug corretti ogni lunedì e martedì. Mercoledì si possono installare tutte le patch aggiornando il codice. Controllare lo (EN) shortlog per vedere se il repository ufficiale è già stato aggiornato o meno.

Per aggiornare il codice all'ultima versione (sul ramo MOODLE_35_STABLE) occorre semplicemente digitare:

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

Se il sito è di produzione, si dovrebbero comunque considerare le istruzioni di Aggiornamento (ad esempio, fare i backup).

Installare un'estensione di terze parti dal repository Git

Quello che segue è un modo per gestire l'aggiunta di plugin da altri repository Git nel repository Moodle. Un altro modo è utilizzare (EN) Git Submodules. Tuttavia, al momento della stesura, questa è una delle caratteristiche più grezze di Git e dovrebbe essere considerata un'opzione avanzata.

Supponiamo ad esempio di voler installare il Modulo Certificato dal repository Git su Moodle 3.5:

$ cd /path/to/your/moodle/
$ cd mod                                                                      (1)
$ git clone https://github.com/markn86/moodle-mod_certificate certificate     (2)
$ cd certificate
$ git checkout -b MOODLE_35_STABLE origin/MOODLE_35_STABLE                    (3)
$ git branch -d master                                                        (4)
  • Il comando (1) cambia la directory corrente nella cartella mod del clone Moodle locale.
  • Il comando (2) crea una nuova sottodirectory certificate e crea un clone locale del repository Certificato.
  • Il comando (3) crea un nuovo ramo locale che traccia il ramo remoto con una versione del certificato per Moodle 3.5.
  • Il comando (4) cancella il master che è stato creato automaticamente dal clone git in (2) poiché non lo vogliamo in questo controllo di produzione.


Nota: Occorre verificare prima la compatibilità di un modulo con il ramo Moodle chiedendo direttamente al Maintainer prima di clonare il repo o - se si vuole indovinarlo - emettendo il comando sottostante prima di eseguire il comando (3), per verificare cosa è disponibile tra i rami:
$ 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/MOODLE_31_STABLE
  remotes/origin/master

Ciò eviterà un messaggio di errore quando si invia il comando (3) a un ramo inesistente, ad esempio:

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


Nota: Per correggere l'errore precedente, utilizzare: "git fetch origin MOODLE_31_STABLE:LOCAL_MOODLE_31_STABLE"

Ora sarebbe meglio aggiungere la nuova cartella mod/certificate/ all'elenco dei file ignorati del clone Moodle principale, altrimenti lo stato del clone principale continuerà a ricordare che il nuovo codice non è stato archiviato.

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

Per aggiornare subito l'installazione di Moodle è necessario visitare entrambi i repository Git e prelevare le modifiche da upstream.

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

Scrivere uno script di shell con queste linee nella root dell'installazione di Moodle è un'ottima idea. Altrimenti è facile dimenticare quali repository Git ci sono all'interno del repository Moodle principale.

Installare e mantenere le estensioni di terze parti utilizzando i sottomoduli Git

Come per la sezione precedente, anche questa sezione è solo per utenti esperti. Pertanto è necessario avere una certa esperienza con Git e i suoi comandi. Verrà fornita una spiegazione dettagliata, ma per seguire questi passaggi è utile capire che cosa fanno questi comandi.

Opzioni e comandi avanzati sono disponibili sul (EN) Git book. Per eventuali domande sui sottomoduli Git, consultare prima (EN) Git Submodules.

Installare una nuova estensione in un sito Moodle esistente

Utilizziamo ad esempio il Modulo Certificato della sezione precedente.

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

Si noti che Git sta segnalando due nuovi file nel 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
#

Il file .gitmodules contiene il percorso locale e l'url di tutti i sottomoduli. Deve essere eseguito, se si intende clonare il repository in un secondo momento; consultare Ambiente di sviluppo Moodle con i sottomoduli Git.
Prima di eseguirlo, assicurarsi di controllare la configurazione del repository Git del plugin, poiché le impostazioni generate automaticamente potrebbero non essere sufficienti. Per gli aggiornamenti futuri è utile tenere traccia del ramo remoto, che corrisponde alla versione Moodle del 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 ha creato il ramo master che traccia origin/master automaticamente perché il repository remoto ha estratto master. Creare pertanto un nuovo ramo, che tiene traccia del ramo remoto appropriato. Naturalmente questo è possibile solo se il repository remoto offre quei rami.

$ 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).

Non è necessario eliminare il ramo master, ma è inutile tenerlo. In effetti, queste impostazioni non devono essere toccate in seguito.

Il passaggio finale consiste nell'eseguire le modifiche nel repository principale:

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

È necessario garantire che l'esecuzione includa solo le modifiche per il nuovo sottomodulo Git (poiché -a esegue tutte le modifiche non effettuate).

Mantenere i sottomoduli Git

Mantenere una serie di sottomoduli è estremamente semplice. Si consideri un repository Moodle con diversi sottomoduli installati. Tenere presente che l'estensione mod_mylittleextension è un plugin falso, creato per uno scenario di test in questo esempio. Non è un modulo Moodle ufficiale. Per aggiornare tutti i sottomoduli in una sola volta digitare:

$ 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)
#

Il comando git submodule foreach [un altro comando] si sposta attraverso tutti i repository del sottomodulo ed esegue ciò che è specificato da [un altro comando]. In questo caso è git pull. Pertanto il modulo mylittleextension è stato aggiornato e il repository principale non è più pulito fino a quando i cambiamenti non vengono eseguiti:

$ git commit -a -m "Plugin updates"

Mantenere i plugin con i sottomoduli Git ha anche un'altra applicazione rispetto al semplice processo di aggiornamento. In una scala più ampia può essere utilizzato per mantenere un progetto Moodle, in cui più sviluppatori devono avere una copia esatta del sito Moodle senza organizzare manualmente i plugin esterni. Ulteriori informazioni su questo argomento sono disponibili su Ambiente di sviluppo Moodle con i sottomoduli Git.

Per saperne di più

Discussioni sul forum:

Risorse esterne: