Git para Administradores

De MoodleDocs

Nota: Esta es una traducción de una página de la documentación en idioma Inglés (Docs), que se considera particularmente importante, y que en su versión original se actualiza frecuentemente. Por ello, se le recomienda que revise la página original en idioma inglés: Git for Administrators.

Esta página describe como mantener una copia de Moodle en un servidor de producción, que pueda ser actualizada fácilmente usando Git. Si hay personalizaciones del código del núcleo (core) de Moodle, se recomienda seguir las instrucciones de Guia de Git para desarrolladores (en inglés).

Para obtener el mayor provecho de Git, vale la pena el esfuerzo para entender sus conceptos básicos (ver también la sección inferior). Aunque la curva de aprendizaje puede ser difícil al principio, especialmente si estás acostumbrado a usar CVS o Subversion.

Obtención de Git (Windows, OSX, Linux y otros)

El soporte para Git estaba originalmente limitado a Linux, pero actualmente está disponible para los sistemas operativos más populares.

Una vez hayas descargado e instalado la versión de Git para tu sistema operativo, las instrucciones (comandos) git de éste documento deberían de funcionar con tu sistema operativo.

Nombres de las ramas de Moodle

Nota: Desde 2022 se recomienda utilizar main en lugar de master para denominar la rama común de Git. Mas información (en inglés): [1]


Las principales versiones de Moodle tienen cada una su propia rama en Git. Por ejemplo, MOODLE_38_STABLE (3.8), MOODLE_405_STABLE (4.5). El desarrollo generalmente se hace en la rama 'main'. Toda la vida de esa versión se conservará en esa rama. Cada versión de Moodle liberada es designada al añadir una etiqueta (tag), como por ejemplo v4.5.0-beta, v4.5.0-rc1, v4.5.0.

Desde la versión 4.0, los códigos de versión utilizan 3 dígitos: 400, 401, 402, ..., 405

Importante: Aun cuando el nombre de la rama incluya la palabra STABLE ('ESTABLE') en su nombre, esto no significa que el código en esa rama sea realmente estable. Poco tiempo después de que se haya creado la rama, contendrá versiones 'beta' y RC, o 'release candidate' (candidato-de versión), de la nueva versión de Moodle. Es importante revisar que el estado actual de la rama cumpla con tus necesidades. Generalmente, la forma más fácil es examinar los contenidos actuales del fichero version.php (sustituye la rama en esta URL para ver cualquier otra versión), https://github.com/moodle/moodle/blob/MOODLE_405_STABLE/version.php

NO USES versiones alfa, beta ni candidatos-de versión (alpha, beta, release-candidates o RC) ni tampoco código de la rama principal (main) para sitios en producción, ya que podrían tener problemas significativos en el código.

Obtención del código desde Git

Aquí se muestra el uso de Git a través de la línea de comando. Los clientes gráficos son poco menos que envoltorios alrededor de la versión para línea de comandos o CLI, por lo que deberías de poder deducir los parámetros correctos muy fácilmente.

Para inicializar un repositorio local, usa los siguientes comandos en el terminal de tu servidor:

$ cd /ruta/hacia/tu/servidor
$ git clone https://github.com/moodle/moodle.git                  (1)
$ cd moodle
$ git branch -a                                                   (2)
$ git branch --track MOODLE_405_STABLE origin/MOODLE_405_STABLE   (3)
$ git checkout MOODLE_405_STABLE                                  (4)
  • El comando (1) inicializa el nuevo repositorio local como una copia del repositorio remoto moodle.git desde GitHub. Se recomienda utilizar este repositorio de GitHub, ya que es el repositorio público de Moodle, y una copia espejo del utilizado en desarrollo. El repositorio remoto se llama por defecto origin. Este comando creará un nuevo directorio local llamado moodle, en donde se descargan todos los archivos. Esta operación puede tomar un tiempo, porque de hecho está obteniendo toda la historia completa de todas las versiones de Moodle.
  • El comando (2) lista todas las ramas disponibles. Ahí se puede comprobar si la rama que queremos instalar en el repositorio local existe en el remoto de Moodle
  • El comando (3) selecciona la rama local, en este caso MOODLE_405_STABLE, y la configura para que sincronice con la rama MOODLE_405_STABLE del repositorio remoto.
  • El comando (4) cambia hacia la rama local recientemente creada. Al finalizar, se puede comprobar la versión utilizada en nuestro repositorio local abriendo el archivo version.php

Git tras un cortafuegos

Git utiliza un protocolo de sólo lectura que puede estar bloqueado por un cortafuegos (puerto 9418). Si esto es un problema, puedes utilizar la versión http de GitHub https://github.com/moodle/moodle.git. Utilizar http es algo más lento, pero es más seguro sobre todo si hay problemas de conectividad.

Actualizando la instalación a una versión menor

El equipo de desarrolladores de Moodle realiza la integración y prueba de problemas resueltos todos los lunes y martes. El miércoles, puedes instalar todos los parches para actualizar tu código. Revisa la bitácora shortlog para ver si el repositorio oficial ha sido actualizado o no.

Para actualizar el código a la versión más reciente (la rama MOODLE_405_STABLE) todo lo que tienes que hacer es:

$ cd /ruta/a/la/carpeta/de/moodle
$ git pull
Nota: la ruta hacia moodle usualmente es /var/www/html o /var/www/html/moodle en servidores Linux


Si es un sitio en producción, debes considerar las instrucciones acerca de la Actualización_de_moodle, y especialmente hacer una copia de seguridad previa a la actualización.

Actualizando tu instalación a una versión mayor

Cuando quieras actualizar a una versión mayor más reciente, necesitarás decirle a tu instalación que siga la versión más reciente en lugar de la versión que actualmente tiene instalada. Debes asegurarte que ha actualizado la instalación con la última versión menor de la versión de Moodle que tienes actualmente instalada (como se describe en la sección anterior). Esto también descargará los cambios para las nuevas versiones de Moodle (pero no hará uso de ellos).

Lo primero que debes hacer es poner el sitio en modo de mantenimiento, o desactivar el sitio web, antes de iniciar la actualización.

$ cd /ruta/a/la/carpeta/de/moodle

# Comprueba la rama que sigues
$ git branch -a

# Crea una rama local para la nueva versión desde el repositorio remoto
$ git branch --track MOODLE_405_STABLE origin/MOODLE_405_STABLE

# Cambia el seguimiento de la rama
$ git checkout MOODLE_405_STABLE

La carpeta de tu sitio contendrá ahora los archivos de la nueva versión de Moodle, pero para completar la actualización, necesitarás realizar la Actualización de Moodle via web o la Actualización de Moodle via CLI

Instalar una extensión de terceros desde su repositorio Git

Esta es una manera de añadir extensiones de terceros desde otros repositorios Git a tu repositorio Moodle. Otra forma sería también usar Submódulos Git. Sin embargo, esta es una de las características más complejas de Git y debería ser considerada como una opción avanzada.

Por ejemplo, queremos instalar el [módulo de Certificado personalizado] desde su repositorio Git en nuestro Moodle 4.5

$ cd /ruta/a/la/carpeta/de/moodle
$ cd mod                                                                          (1)
$ git clone https://github.com/mdjnelson/moodle-mod_customcert.git customcert     (2)
$ cd customcert
$ git checkout -b MOODLE_405_STABLE origin/MOODLE_405_STABLE                      (3)
$ git branch -d main                                                              (4)

El comando (1) cambia el directorio actual al directorio mod de la instalación de Moodle. El comando (2) crea un nuevo directorio llamado customcert y realiza un clon local del repositorio del módulo Custom Certificate (Certificado personalizado). El comando (3) crea una rama local que seguirá la rama remota con la versión del módulo Custom Certificate para Moodle 4.5. El comando (4) elimina la rama main que fue creada automáticamente por git clone en (2) y no es necesaria en la instalación.

Nota: Debes comprobar primero la compatibilidad del módulo con tu versión de Moodle. Puedes hacerlo ejecutando el siguiente comando antes de ejecutar el comando (3), para verificar que está disponible entre las ramas:

$ git branch -a
* MOODLE_405_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/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_310_STABLE
  remotes/origin/MOODLE_311_STABLE
  remotes/origin/MOODLE_31_STABLE
  remotes/origin/MOODLE_32_STABLE
  remotes/origin/MOODLE_33_STABLE
  remotes/origin/MOODLE_34_STABLE
  remotes/origin/MOODLE_35_STABLE
  remotes/origin/MOODLE_36_STABLE
  remotes/origin/MOODLE_37_STABLE
  remotes/origin/MOODLE_38_STABLE
  remotes/origin/MOODLE_39_STABLE
  remotes/origin/MOODLE_400_STABLE
  remotes/origin/MOODLE_401_STABLE
  remotes/origin/MOODLE_402_STABLE
  remotes/origin/MOODLE_403_STABLE
  remotes/origin/MOODLE_403_STABLE
  remotes/origin/MOODLE_403_STABLE
  remotes/origin/MOODLE_404_STABLE
  remotes/origin/MOODLE_405_STABLE
  remotes/origin/master

Esto evitará un mensaje de error cuando ejecutes el comando (3) contra una rama no existente. Por ejemplo:

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

Nota: Para solucionar el error, usa "git fetch"

$ git fetch origin MOODLE_405_STABLE:LOCAL_MOODLE_405_STABLE

Es buena idea añadir el nuevo directorio mod/customcert/ a la lista de archivos ignorados situado en la carpeta raíz de Moodle, si no, aparecerá un aviso recordándote que hay nuevo código sin actualizar.

$ cd /ruta/hacia/tu/servidor
$ echo /mod/customcert/ >> .git/info/exclude

Para actualizar ahora tu instalación Moodle, debes entrar a ambos repositorios y hacer "git pull" para actualizar.

$ cd /ruta/hacia/tu/servidor
$ git pull
$ cd mod/customcert
$ git pull

Escribir un script del shell con estas líneas en el directorio raíz de tu instalación es una buena idea. Si no, es fácil de olvidar que repositorios están dentro del directorio de Moodle.

Instalando y manteniendo extensiones de terceros usando los submódulos de Git

Como se ha indicado anteriormente, este apartado es para usuarios avanzados.

Por tanto, es importante que tengas conocimientos previos de Git y de sus comandos. A continuación se indican los pasos a seguir. Es importante conocer lo que hacen los siguiientes comandos.

Las opciones avanzadas y los comandos pueden encontrarse en [Git book]. Si tienes dudas sobre los submódulos Git, visita este sitio primero.

Instalando una nueva extensión usando submódulos Git en un sitio Moodle ya existente

Como ejemplo, vamos a usar el Módulo customcert mostrado en la sección anterior.

$ cd /ruta/a/la/carpeta/de/moodle
$ git submodule add https://github.com/mdjnelson/moodle-mod_customcert.git mod/customcert

Nota que Git está mostrando dos archivos nuevos en el repositorio:

$ git status
On branch MOODLE_29_STABLE
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

new file:   .gitmodules
new file:   mod/customcert

El archivo .gitmodules contiene la ruta local y la URL de todos los submódulos.

Tiene que ser publicado (commited) si lo quieres clonar después (ver la página [2])

Antes de publicarlo, asegúrate de comprobar la configuración de los repositoris Git de las extensiones, ya que la configuración generada automáticamente puede no ser suficiente.

Ayudará en futuras actualizaciones a rastrear la rama remota, que corresponda con la versión de Moodle de tu repositorio.

$ cd mod/customcert
$ git branch -avv
* MOODLE_404_STABLE                7431bd6 [origin/MOODLE_404_STABLE] Bumped version
  remotes/origin/HEAD              -> origin/MOODLE_404_STABLE
  remotes/origin/MOODLE_29_STABLE  a98a860 Bumped version
  remotes/origin/MOODLE_30_STABLE  a98a860 Bumped version
  remotes/origin/MOODLE_310_STABLE 3a47bf0 Bump version
  remotes/origin/MOODLE_311_STABLE 8c4f3a3 Improve SQL for displaying custom profile fields
  remotes/origin/MOODLE_31_STABLE  64a1842 #192 Fixed report fields for download
  remotes/origin/MOODLE_32_STABLE  6c21cd4 #192 Fixed report fields for download
  remotes/origin/MOODLE_33_STABLE  8598927 Bumped version
  remotes/origin/MOODLE_34_STABLE  cc0d7c3 Add vertical spacing after certificate download button
  remotes/origin/MOODLE_35_STABLE  e25ebd6 Fixed size of 'Changed' in CHANGES.md
  remotes/origin/MOODLE_36_STABLE  be34b27 Fixed size of 'Changed' in CHANGES.md
  remotes/origin/MOODLE_37_STABLE  86322e0 Fix PHPDocs for the method get_course_field_value()
  remotes/origin/MOODLE_38_STABLE  1f63287 Bump version
  remotes/origin/MOODLE_39_STABLE  436ae10 Stop using deprecated pipe coreToLocaleString
  remotes/origin/MOODLE_400_STABLE 0212fa3 Use phpcbf to add trailing commas to multiple arrays
  remotes/origin/MOODLE_401_STABLE bd931f5 Bumped version
  remotes/origin/MOODLE_402_STABLE 27b64a3 Bumped version
  remotes/origin/MOODLE_403_STABLE 35b62d0 Bumped version
  remotes/origin/MOODLE_404_STABLE 7431bd6 Bumped version
  remotes/origin/develop           bac2969 Make new setting description more detailed (#531)

Git creó la rama principal, en este caso develop que rastrea origin/develop automáticamente, porqué el repositorio remoto ha comprobado develop. Entonces, crea una nueva rama, que rastree la rama remota correspondiente. Obviamente, esto es posible siempre que el repositorio disponga de las ramas solicitadas.

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

No es necesario eliminar la rama develop, pero es innecesario mantenerla. De hecho, esta configración no necesita ser cambiada posteriomente.

El paso final es publicar los cambios en el repositorio principal.

$ cd /ruta/a/la/carpeta/de/moodle
$ git commit -a -m "Instalada la nueva versión de mod_customcert"

Tienes que asegurarte que la publicación (commit) solo incluye del nuevo submódulo Git (ya que -a publica todos los cambios pendientes).

Manteniendo submódules Git

Mantener un grupo de submódulos Git es muy fácil.

Considera el repositorio Moodle con diferentes submódulos instalados. Ten en cuenta que la extensión mod_mylittleextension es una extensión falsa, creada para las pruebas de este ejemplo. Este no es un módulo oficial de Moodle. Para actualizar todos los submódulos a la vez, introduce:

$ cd cd /ruta/hacia/tu/servidor
$ git submodule foreach git pull
Entering 'block/coursefeedback'
Already up-to-date.
Entering 'mod/customcert'
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_405_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)
#

El comando git submodule foreach [otro comando] actúa sobre todos los repositorios de los submódulos y ejecuta lo indicado en [otro comando]. En este caso es git pull. Por tanto, el módulo mylittleextension se actualizó y el repositorio principal no se elimina más hasta que los cambios son publicados (commited):

$ git commit -a -m "Actualización de extensiones"

Mantener las extensiones con submódulos Git tiene también simplifica el proceso de actualización. A mayor escala, puede ser usado para mantener un proyecto Moodle, donde multiples desarrolladores necesitan tener una copia exacta de los módulos sin organizar las extensiones externas manualmente. Puedes leer más sobre este tema en [3].

Ver también

Moodle Docs
Documentación Moodle antigua
Discusiones del foro de Moodle (en inglés)
Enlaces externos

[[4]] [[5]] [for Administrators]