Creative Commons License
Excepto donde se indique otra cosa, todo el contenido de este lugar está bajo una licencia de Creative Commons.
Taquiones > ikiwiki > Ikiwiki y git

Ikiwiki y git

La disposición recomendada para usar IkiWiki y Git consiste en crear un repositorio raíz desnudo (sin árbol de archivos) y varios clones de trabajo (que sí tienen árbol de directorios) como nodos finales, desde los que se harán cargas (push) y descargas (pull) de datos contra el raíz.

Uno de éstos nodos clon es especial, ya que se usa para compilar el wiki y guardar los cambios (vía commit) que se hacen a través del interfaz web (complemento cgi). Este repositorio tendrá un directorio de trabajo y será al que apuntemos con la variable de configuración de IkiWiki srcdir.

Como normal general los cambios se deben enviar (git push) al repositorio raíz y no a ninguno de los clones.

Como práctica recomendada tendremos entonces que crear tres repositorios, que vamos a describir en subsecciones individuales.

Repositorio raíz

Es el que debería tener lo mínimo imprescindible (bare repository), es decir, sin árbol de carpetas donde trabajar, y el que emplearán los otros repositorios para cargar y descargar datos. Es a él al que se refiere la documentación de ikiwiki-makerepo como repository.

Además contiene un programa de post-actualización (post update hook) que efectúa las tareas de compilación del wiki de la siguiente forma:

  1. Cambia al directorio de trabajo del wiki (srcdir),
  2. actualiza el repositorio (git pull)
  3. y refresca el contenido (ikiwiki refresh) para crear las correspondientes páginas HTML.

Una forma de crear un repositorio de este tipo es como sigue:

$ cd /var/lib/git/
$ mkdir mywiki && cd mywiki
$ git-init --bare
Initialized empty Git repository in /var/lib/git/mywiki
$

Repositorio de compilación

Este repositorio es un clón del raíz y se emplea como lugar de trabajo para compilar el wiki y obtener las páginas HTML correspondientes, así como para mantener los cambios si se emplea el interfaz CGI, por lo que podemos deducir que deberá tener los permisos de acceso necesarios para que éste componente funcione (en Debian generalmente es el usuario www-data el que debe tener acceso).

La configuración de IkiWiki lo referencia como srcdir y para crearlo se puede emplear lo siguiente:

$ cd /var/lib/git
$ git clone -l -n mywiki mywiki-working 
Initialized empty Git repository in /var/lib/mywiki-working
$

Repositorio de actualización

El tercer, cuarto y/ó quinto repositorio (tantos como se desee) son también copias clon de repositorio raíz y tienen un directorio de trabajo donde se efectuarán los cambios que no procedan del complemento cgi. Se consideran repositorios de trabajo diario y serán desde los que terminen enviando los cambios al repositorio raíz; allí el programa de post-actualización se pondrá en marcha y actualizará la copia de trabajo local y construirá e instalará las páginas web resultantes.

Es primordial que nunca se envíen los cambios a un repositorio con directorio de trabajo, es decir, que no se efectúen operaciones push contra el directorio de compilación ó cualquiera de los de actualización. Siempre se debe emplear para esto el repositorio raíz.

Archivo ikiwiki.setup

Así pues tendremos una máquina donde residen los repositorios raíz y de compilación, y varias máquinas más (en casa, en el trabajo, portátil ... ) donde estarán copias del raíz y que se emplearán para mantener el wiki. Dada esta disposición de repositorios el archivo de configuración 'ikiwiki.setup' necesita algunos retoques concretos, sobre todo en la parte de localización de repositorios.

use IkiWiki::Setup::Standard {
    wikiname        =>  'MyWiki',
    adminemail      =>  'root@mywiki.com',

    # subdirectorio de fuentes dentro del repositorio 
    # de compilación
    srcdir          =>  '/var/lib/git/mywiki-working/src',

    # directorio final, en este caso la raíz del servidor web local
    destdir         =>  '/var/www',

    # URL base desde el que crear el resto 
    url             =>  'http://mymachine',

    # subdirectorio donde encontrar las plantillas 
    templatedir     => "/var/lib/git/mywiki-working/templates/",

    # subdirectorio donde encontrar los archivos básicos de un wiki
    underlaydir     => "/var/lib/git/mywiki-working/base/",

    rcs             =>  'git',

...

Y no nos olvidamos de añadir la configuración de los programas auxiliares:

    wrappers    =>  [
        ...
        {
        # el programa activado tras una recepción de datos en el
        # repositorio 
        wrapper     =>  "/var/lib/mywiki/hooks/post-update",
        wrappermode =>  04755,
        notify      =>  1,
        ...
        },
        ...
    },

En este caso fijándonos bien en que el wiki es el raíz y no el de compilación.

Pasos a seguir para actuar sobre un wiki

  1. Obtener una copia del repositorio raíz, asumiendo que estamos en otra máquina y que existe un servidor git al que podemos acceder.

    $ mkdir git
    $ git clone git://mymachine/pub/mywiki git/mywiki
    
  2. Efectuar las modificaciones tales como añadir archivos (git add), borrarlos (git rm) ó alterar su contenido, y registrar los cambios regularmente con git commit -a.

  3. Enviar los cambios al servidor:

    $ git push

  4. Disfrutar del resultado :-)

Operaciones muy concretas

Crear un repositorio desnudo (bare repository)

Asumiendo que un repositorio desnudo es aquél que no tiene directorio de trabajo se pueden dar los dos casos:

  1. Tenemos un repositorio con directorio de trabajo y queremos convertirlo en uno desnudo:

    $ git clone --bare -l <ruta_al_repositorio> <ruta_al_nuevo_repositorio>
    

    y luego basta con renombrar el antiguo con otro nombre como copia de seguridad (aunque también se puede borrar sin más), y cambiar el nombre del nuevo repositorio al antiguo. Todo esto para que las copias de trabajo del repositorio no tengan que actualizarse con nuevos parámetros.

    Por cierto, el parámetro -l de git-clone se debe emplear cuando se trata de repositorios locales, ya que se salta el proceso de transporte habitual en estos casos y realiza enlaces duros de los archivos en lugar de copiarlos.

  2. Queremos crear un repositorio desnudo desde el principio:

    $ mkdir my_new_repo
    $ cd my_new_repo 
    $ git-init --bare 
    Initialized empty Git repository in ... my_new_repo/