Capítulo 10. Gestión de información

Tabla de contenidos

10.1. Compartición, copia y archivo
10.1.1. Herramientas de repositorios y compresión
10.1.2. Herramientas de sincronización y copia
10.1.3. Formas de archivado
10.1.4. Formas de copia
10.1.5. Formas de selección de archivos
10.1.6. Medios de archivo
10.1.7. Dispositivos de almacenamiento extraibles
10.1.8. Selección del sistema de archivos para compartir datos
10.1.9. Compartición de información a través de la red
10.2. Respaldo y recuperación
10.2.1. Suites de utilidades de copias de seguridad
10.2.2. Un ejemplo del archivo de órdenes para el sistema de copias de seguridad
10.2.3. Un archivo de órdenes para copiar la información de backup
10.3. Infraestructura de seguridad de la información
10.3.1. Gestión de claves con GnuPG
10.3.2. Usando GnuPG en archivos
10.3.3. Uso de Mutt con GnuPG
10.3.4. Utilizando Vim con GnuPG
10.3.5. El resumen MD5
10.4. Herramientas para mezclar código fuente
10.4.1. extrae las diferencias entre dos archivos fuente
10.4.2. Mezcla actualizaciones del archivos de código fuente
10.4.3. Actualizando por medio de la mezcla de la tres formas
10.5. Sistemas de control de versiones
10.5.1. Comparación de órdenes CVS
10.6. Git
10.6.1. Configuración del cliente Git
10.6.2. Algunas referencias sobre Git
10.6.3. Órdenes Git
10.6.4. Git para repositorios Subversion
10.6.5. Git para guardar el histórico de configuraciones
10.7. CVS
10.7.1. Configuración de un repositorio CVS
10.7.2. Acceso local a CVS
10.7.3. Acceso remoto a CVS con pserver
10.7.4. Acceso remoto a CVS con ssh
10.7.5. Importando un nuevo recurso a CVS
10.7.6. Permisos de archivo en un repositorio CVS
10.7.7. Flujo de trabajo de CVS
10.7.8. Últimos archivos CVS
10.7.9. Administración del servicio CVS
10.7.10. Bit de ejecución para la comprobación del CVS
10.8. Subversion
10.8.1. Configuración de un repositorio con Subversion
10.8.2. Acceso a Subversion a través del servidor Apache2
10.8.3. Acceso local a Subversion basada en el grupo
10.8.4. Acceso remoto a Subversion con SSH
10.8.5. Estructura de directorios de Subversion
10.8.6. Importando una nueva fuente a Subversion
10.8.7. Flujo de trabajo en Subversion

Se describen las herramientas y operaciones para la gestión de información en formato binarios y texto.

[Aviso] Aviso

El acceso de escritura sin coordinación a los dispositivos disponibles y a los archivos desde varios procesos no debe realizarse sin evitar la condición de carrera. Para evitarla se puede utilizar el mecanismo de bloqueo del archivo (file locking) flock(1).

La seguridad de la información y el control de su compartición tiene varios aspectos.

  • La creación de un repositorio de información

  • El acceso al almacenamiento remoto

  • La duplicación

  • El seguimiento del histórico de modificaciones

  • Las facilidades de la compartición de la información

  • Evitar el acceso no autorizado a archivos

  • La detección de modificaciones no autorizadas de archivos

Esto se puede llevar a cabo por la combinación de algunas herramientas.

  • Herramientas de repositorios y compresión

  • Herramientas de sincronización y copia

  • Sistemas de archivos en red

  • Medios de almacenamiento extraibles

  • El intérprete de órdenes seguro

  • El sistema de autenticación

  • Herramientas de sistemas de control de versiones

  • Herramientas de criptográficas de cifrado y resumen

Aquí esta un resumen de las herramientas de repositorio y compresión disponibles en un sistema Debian.

Tabla 10.1. Relación de las herramientas de repositorios y compresión

paquete popularidad tamaño extensión orden comentario
tar V:907, I:999 2770 .tar tar(1) el archivador estándar (estándar de facto)
cpio V:320, I:998 720 .cpio cpio(1) Archivador estilo Unix System V, utilizado con find(1)
binutils V:169, I:702 223 .ar ar(1) archivador para la creación de bibliotecas estáticas
fastjar V:5, I:53 172 .jar fastjar(1) archivador para Java (similar a zip)
pax V:16, I:48 170 .pax pax(1) nuevo archivador estándar POSIX, comprometido entre tar y cpio
gzip V:877, I:999 231 .gz gzip(1), zcat(1), … Utilidad de compresión GNU LZ77 (estándar de facto)
bzip2 V:212, I:939 184 .bz2 bzip2(1), bzcat(1), … La utilidad de compresión por ordenamiento de bloques Burrows-Wheeler tiene el índice de compresión mayor que gzip(1) (más lento que gzip con una sintáxis similar)
lzma V:4, I:54 126 .lzma lzma(1) La utilidad de compresión LZMA tiene un índice de compresión más alto que gzip(1) (obsoleto)
xz-utils V:401, I:955 515 .xz xz(1), xzdec(1), … La utilidad de compresión XZ tiene un índice de compresión mayor que bzip2(1) (más lento que gzip pero más rápdio que bzip2; es el sustituyo del la utilidad de compresión LZMA)
p7zip V:66, I:312 934 .7z 7zr(1), p7zip(1) El archivador de archivos 7-Zip tiene el alto índice de compresión (compresión LZMA)
p7zip-full V:155, I:528 4407 .7z 7z(1), 7za(1) El archivador de archivos 7-Zip tiene un alto nivel de compresión (compresión LZMA y otros)
lzop V:5, I:45 97 .lzo lzop(1) La utilidad de compresión LZO tiene una velocidad de compresión y descompresión más alta que gzip(1) (menor índice de compresión que gzip con una sintáxis parecida)
zip V:50, I:415 608 .zip zip(1) InfoZIP: herramienta de archivo y compresión DOS
unzip V:272, I:796 534 .zip unzip(1) InfoZIP: herramienta de desarchivo y descompresión DOS

[Aviso] Aviso

No asigne la variable «$TAPE» a menos que sepa sus consecuencias. Esta cambia el comportamiento tar(1).

[Nota] Nota

Cuando se realiza una compresiñon gzip de un archivo tar(1) se utiliza la extensión de archivo «.tgz» o «.tar.gz».

[Nota] Nota

La compresión xz de un archivo tar(1) utiliza la extensión de archivo «.txz» o «.tar.xz».

[Nota] Nota

Los métodos de compresión más populares entre las herramientas FOSS como tar(1) ha evolucionado como se muestra: gzipbzip2xz

[Nota] Nota

cp(1), scp(1) y tar(1) puede tener alguna limitación con archivos especiales. Cpio(1) es más versátil.

[Nota] Nota

cpio(1) esta diseñado para ser utilizado con find(1) y otras órdenes y archivos de órdenes para la creación de copias de respaldo ya que la parte de selección de archivo del archivo de órdenes puede ser probado de forma independiente.

[Nota] Nota

Internal structure of Libreoffice data files are ".jar" file which can be opened also by unzip.

[Nota] Nota

The de-facto cross platform archive tool is zip. Use it as "zip -rX" to attain the maximum compatibility. Use also the "-s" option, if the maximum file size matters.

Aquí hay un resumen de las herramientas de copia y respaldo disponibles en el sistema Debian.


La copia de archivos con rsync(8) aporta muchas más funcionalidades que otros.

  • el algorimo de transferencia delta envia únicamente las diferencias entre los archivos de origen y los archivos que hay en el destino

  • el algoritmo de comprobación rápido (quick check algorithm) (por omisión) busca los archivos que han cambiado su tamaño o su fecha de última modificación

  • las opciones «--exclude» y «--exclude-from» son parecidas a las de tar(1)

  • la sintáxis de «una barra «/« en el directorio origen« evita la creación de un nivel de directorios adicional en el destino

[Sugerencia] Sugerencia

La ejecución del archivo de órdenes bkup que se menciona en Sección 10.2.3, “Un archivo de órdenes para copiar la información de backup” con la opción «-gl» en cron(8) aporta una funcionalidad parecida a la de dumpfs en Plan9 para el archivo de datos estáticos.

[Sugerencia] Sugerencia

Las herramientas de sistemas de control de versiones (VCS) en Tabla 10.11, “Relación de herramientas de sistemas de control de versiones” pueden operar como herramientas de sincronización y copia en múltiples sentidos.

Aquí están diferentes maneras de copiar el contenido completo de un directotio «./origen» utilizando diferentes herramientas.

  • Copia local: directorio «./origen» → directorio «/destino»

  • Copia remota: directorio «./origen» en el equipo local → directorio «/destino» en el equipo «usuario@equipo.dom»

rsync(8):

# cd ./origen; rsync -aHAXSv . /destino
# cd ./origen; rsync -aHAXSv . usuario@equipo.dom:/destino

Puede utilizar la sintáxis de «barra «/« en el directorio origen«.

# rsync -aHAXSv ./origen/ /destino
# rsync -aHAXSv ./origen/ usuario@equipo.dom:/destino

Otra forma es como se muestra.

# cd ./origen; find . -print0 | rsync -aHAXSv0 --files-from=- . /destino
# cd ./origen; find . -print0 | rsync -aHAXSv0 --files-from=- . usuario@equipo.dom:/destino

GNU cp(1) y openSSH scp(1):

# cd ./origen; cp -a . /destino
# cd ./origen; scp -pr . usuario@equipo.dom:/destino

GNU tar(1):

# (cd ./origen && tar cf - . ) | (cd /destino && tar xvfp - )
# (cd ./origen && tar cf - . ) | ssh usuario@equipo.dom '(cd /destino && tar xvfp - )'

cpio(1):

# cd ./origen; find . -print0 | cpio -pvdm --null --sparse /destino

Puede sustituir «.» por «foo» para todos los ejemplos que contienen «.» para copiar archivos desde el directorio «./origen/foo» al directorio «/destino/foo».

Puede sustituir «.» por la ruta absoluta «/ruta/al/origen/foo» para todos los ejemplos que contienen «.» para eliminar «cd ./source;». La copia de estos archivos a diferentes ubicaciones depende de las herramientas utilizadas como se muestra.

  • «/destino/foo»: rsync(8), GNU cp(1) y scp(1)

  • «/destino/ruta/al/origen/foo»: GNU tar(1) y cpio(1)

[Sugerencia] Sugerencia

Rsync(8) y GNU cp(1) tiene la opción «-u» para no tener en cuenta los archivos que son más nuevos que los recibidos.

La órden find(1) es utilizada para la selección de archivos en combinación con las órdenes de archivado y copia (consulte Sección 10.1.3, “Formas de archivado” and Sección 10.1.4, “Formas de copia”) o por xargs(1) (consulte Sección 9.3.9, “Repetición de una órden sobre archivos”). Esto se puede mejorar con la utilización de los parámetros de la órden.

La sintáxis básica de find(1) se puede resumir en lo que se muestra.

  • los parámetros condicionales son evaluados de izquierda a derecha

  • Esta evaluación se para una vez que se ha determinado la salida.

  • El «O lógico« (que se escribe «-o» entre condiciones) tiene menor precedencia que el «Y lógico« (que se escribe «-a» o vacio entre condiciones).

  • El «NO lógico« (que se escribe «!» antes de la condición) tiene mayor precedencia que el «Y lógico«.

  • La expresión «-prune» devuelve siempre un VERDADERO lógico y, si es un directorio, la búsqueda del archivos es detenida al llegar a este punto.

  • La expresión «-name» encaja con los nombres de archivos con el mismo tipo de expresiones regulares que se usan en el intérprete de órdenes (glob) (consulte Sección 1.5.6, “Expansión de un patrón en el intérprete de órdenes”) pero también encaja su «.» inicial con metacaracteres como «*» y «?». (Nueva funcionalidad de POSIX)

  • La expresión «-regex» encaja con rutas absolutas al estilo de emacs BRE (consulte Sección 1.6.2, “Expresiones regulares”) por defecto.

  • La expresión «-size» encaja con los archivos en base a su tamaño (el valor precedido de «+» para mayor y precedido de «-» para menor)

  • La expresión «-newer» encaja con archivos más recientes que el que consta como parámetro.

  • La expresión «-print0» devuelve siempre un VERDADERO lógico e imprimet el nombre de archivo completo (finalizado con un null) por la salida estándar..

La órden find(1) se utiliza frecuentemente con el estilo que se muestra a continuación.

# find /ruta/a \
    -xdev -regextype posix-extended \
    -type f -regex «.*\.cpio|.*~« -prune -o \
    -type d -regex «.*/\.git« -prune -o \
    -type f -size +99M -prune -o \
    -type f -newer /path/to/timestamp -print0

Lo que se traduce en las acciones siguientes.

  1. Busca todo los archivos que comienzan con «/ruta/a»

  2. Limita la búsqueda globalmente al comienzo de su sistema de archivos y en su lugar utiliza ERE (consulte Sección 1.6.2, “Expresiones regulares”)

  3. Excluye los archivos que encajan con las expresiones regulares «.*\.cpio» o «.*~» de la búsqueda sin procesarlos

  4. Excluye los directorios que encajan con la expresión regular de «.*/\.git» de la búsqueda sin procesarlas

  5. Excluye los archivos cuyo tamaño es mayor de 99 Megabytes (en bytes 1048576 ) de la búsqueda sin procesarla

  6. Impreme los nombres de los archivos que cumplen los criterios de búsqueda anterirores y son más nuevos que el «/ruta/al/sellodetiempo»

Tenga el cuenta la forma en que se utiliza «-prune -o»para excluir los archvios en los ejemplos anteriores.

[Nota] Nota

Para sistemas no Debian tipo Unix, algunas opciones de find(1) pueden no estar disponibles. En ese caso, por favor, considere ajustar los métodos de encaje y sustituya «-print0» con «-print». Puede que también necesite ajustar las órdenes parecidas.

Cuando elija los medios de almacenamiento de información para el archivo de información importante, debe tener cuidado con sus limitaciones. Para el respaldo de pequeñas cantidades de información personal, yo utilizo CD-R y DVD-R de una compañia conocida y los almaceno en un lugar fresco, sin luz, seco y limpio. (El medio de archivo en cinta parece una opción común en entornos profesionales).

[Nota] Nota

Un lugar resistente al fuegoA fire-resistant safe tiene sentido para documentos en papel. La mayor parte de los medios de almacenamiento de información tienen menor tolerancia a la temperatura que el papel. Yo normalmente mantengo almacenadas varias copias cifradas en diferentes ubicaciones seguras.

Tiempo de vida optimista de los medios de archivo (la mayor parte proveniente de los proveedores del medio).

  • Más de 100 años: papel libre de ácido con tinta

  • 100 años : almacenamiento óptico (CD/DVD, CD/DVD-R)

  • 30 años: almacenamiento magnético (cinta, diquete)

  • 20 años: almacenamiento óptico con cambio de fase (CD-RW)

Esto no tiene en cuenta los errores mecánicos debido al manejo etc.

Ciclo de escritura de medios de archivos optimista visto en internet (proveniente de la información aportada por el vendedor).

  • Más de 250,000 ciclos : discos duros

  • Más de 10,000 ciclos : memoria flash

  • 1,000 ciclos : CD/DVD-RW

  • 1 ciclo : CD/DVD-R, papel

[Atención] Atención

Los datos que vida de los medios de almacenamiento y de los ciclos de escritura que hemos comentado no deben ser tenidos en cuenta para la toma de decisiones sobre almacenamiento de datos críticos. Por favor, consulte la informaciń especifica del producto que proporciona el fabricante.

[Sugerencia] Sugerencia

Ya que los CD/DVD-R y el papel tienen únicamente un ciclo de escritura, impide de informa intrínseca la pérdida de datos por sobreescritura. ¡Esto es una ventaja!

[Sugerencia] Sugerencia

Si necesita copias de respaldo rápidas, frecuentes y de grandes cantidades de información, un disco duro en un equipo remoto sonre una conexión de red rápida, puede ser la única opción real.

Un dispositivo de almacenamiento extraible puede pertenecer a uno de los siguientes tipos:

Pueden ser conectados mediante:

Los entornos de escritorio modernos como GNOME y KDE pueden montar automaticamente estos dispositivos extraibles sin su entrada correspondiente en «/etc/fstab».

  • El paquete udisks aporta un demonio y las utilidades correspondientes para montar y desmontar estos dispositivos.

  • D-bus crea los eventos para iniciar automáticamente dicho proceso.

  • PolicyKit aporta los permisos necesarios.

[Sugerencia] Sugerencia

Los dispositivos que se montan de forma automática pueden tener la opción de montaje «uhelper=» que es utilizada por umount(8).

[Sugerencia] Sugerencia

En los entornos de escritorio modernos el automontaje ocurre unicamente cuando el dispositivo no posee una entrada en «/etc/fstab».

En los entornos de escritorio modernos el punto de montaje es «/media/<etiqueta_del_disco>» que puede ser personalizado como se muestra.

  • mlabel(1) para el sistema de archivos FAT

  • genisoimage(1) con la opción «-V» para el sistema de archivos ISO9660

  • tune2fs(1) con la opción «-L» para los sistemas de archivos ext2/ext3/ext4

[Sugerencia] Sugerencia

Puede que necesite proporcionar el tipo de codificación como una opción a la hora del montaje (consulte Sección 8.4.6, “Códificación del nombre del archivo”).

[Sugerencia] Sugerencia

Si utiliza el menú del interfaz gráfico de usuario para desmontar un sistema de archivos puede eliminar su nodo de dispositivo generado dinamicamente como «/dev/sdc». Si quiere mantener el node del dispositivo, desmontelo con la órden umount(8) desde el cursor del intérprete de órdenes.

Cuando comparte información con otro sistema por medio de un dispositivo de almacenamiento extraible, podría formatearlo en un sistema de archivos que tenga soporte en ambos sistemas. Aquí esta una relación de posibles candidatos.


[Sugerencia] Sugerencia

Consulte Sección 9.8.1, “Cifrado de discos externos con dm-crypt/LUKS” para la compartición de información entre plataformas utilizando cifrado a nivel de dispositivo.

El sistema de archivos FAT esta soportado por casit todos los sistemas operativos modernos y es bastante útil para el intercambio de información por medio de un disco duro externo.

Cuando se formatea un disco duro externo con el sistemas de archivos FAT para compartir información entre diferentes platadormas, lo siguiente podrían ser las opciones más seguras.

Cuando se utilizan los sistemas de archivos FAT o ISO9660 para compartición de información tenga en cuenta las consideraciones siguientes:

  • El archivo de archivos se recomienda utilizar primero tar(1), o cpio(1) par mantener los nombres de archivos largos, los enlaces blandos, los permisos originales de Unix y la información del propietario.

  • Para protegerlo de las limitaciones de tamaño divida el archivo en trozos menores de 2GiB con la órden split(1).

  • Cifre el archivo para asegurar que no existirán accesos no autorizados.

[Nota] Nota

En sistemas de archivos FAT debido a su diseño, el tamaño máximo de un archivo es (2^32 - 1) bytes = (4GiB - 1 byte). Para algunas aplicaciones antiguas en SSOO de 32 bits, el tamaño máximo de archivo es todavía menor (2^31 - 1) bytes = (2GiB - 1 byte). Debian no tiene este último problema.

[Nota] Nota

La propia compañia Microsoft no recomienda el uso de FAT para dispostivos o particiones menores de 200 MB. Microsoft resalta en su «Visión de conjunto de los sistemas de archivos FAT, HPFS y NTFS« su uso ineficiente del espacio de disco. Sin duda en Linux habitualmente usaremos el sistema de archivos ext4.

[Sugerencia] Sugerencia

Para más información acerca de sistemas de archivos y su uso, por favor lea «Cómo Sistemas de Archivos«.

Todos sabemos que los equipos fallan algunas veces o los errores humanos producen daños en el sistema o la información. Las operaciones de copia de seguridad y respaldo son una parte esencial de la administración de sistemas. Todos los errores posible ocurrirán alguna vez.

[Sugerencia] Sugerencia

Mantenga su sistema de respaldo simple y cree copias de seguridad con frecuencia. El hecho de tener copias de seguridad de la información es más importante que la forma en las que las realice.

Existen tres factores que determinan la directriz de copia de seguridad y recuperación real.

  1. Saber lo qué hay que respaldar y recuperar.

    • Los archivos creados por usted: información en «~/»

    • Archivos de información creados por las aplicaciones que utiliza: la información en «/var/» (excepto «/var/cache/», «/var/run/» y «/var/tmp/»)

    • Archivos de configuración del sistema: información en «/etc/»

    • Software local: información en «/usr/local/» o «/opt/»

    • Información de la instalación del sistema: un resumen en texto plano de los pasos fundamentales (particionado, ...)

    • Probar el conjunto de datos: confirmarlo mediante la ejecución de operaciones de recuperación

  2. Saber como respaldar y recuperar datos.

    • Asegurar el el almacenamiento de información: protegerlo de la sobreescritura y del fallo del sistema

    • Frecuencia de respaldo: planficación del respaldo

    • Redundancia de respaldo: copias de la información

    • Proceso a prueba de fallos: una única y sencilla órden para crear la copia de respaldo

  3. Evaluación de riesgos y costes implícitos.

    • Valor de los datos ante la pérdida

    • Uso de recursos para el respaldo: humanos, hardware, software, …

    • Modo de error en la recuperación y sus posibilidades

[Nota] Nota

No respalde el contenido de los pseudo sistemas de archivos ubicados en /proc, /sys, /tmp y /run (consulte Sección 1.2.12, “procfs y sysfs” y Sección 1.2.13, “tmpfs”). A menos que sepa exactamente que está haciendo, estas ubicaciones contienen grandes cantidades de información poco relevantes.

Para el almacenamiento seguro de información, la información debe al menos estar en parciones distintas de disco y preferentemente en discos diferentres y máquinas diferentes para resistir la corrupción del sistema de archivos. La información importante es mejor almacenarla en medios que solo permiten una grabación com CD/DVD-R para evitar sobreescribirla por accidente. (Consulte Sección 9.7, “Datos binarios” para saber como escribir en los medios de almacenamiento desde el intérpre de órdenes. El entorno GNOME a través del interfaz gráfico de usuario ofrece un acceso fácil desde el menú: «Ubicaciones→Crear CD/DVD«.)

[Nota] Nota

Puee que quiera para algunos demonios como MTA (consulte Sección 6.3, “Agente de transporte de correo (Mail transport agent, MTA)”) mientras respalda su información.

[Nota] Nota

Debe tener especial cuidado con el respaldo y restauración de los archivos de identificación como «/etc/ssh/ssh_host_dsa_key», «/etc/ssh/ssh_host_rsa_key», «~/.gnupg/*», «~/.ssh/*», «/etc/passwd», «/etc/shadow», «/etc/fetchmailrc», «popularity-contest.conf», «/etc/ppp/pap-secrets» y «/etc/exim4/passwd.client». Algunos de estos elementos puede no ser regeneradod partiendo de la misma entrada del sistema.

[Nota] Nota

Si una un trabajo cron como un proceso de usuario, debe restaurar los archivos en el directorio «/var/spool/cron/crontabs» y reinicie cron(8). Consulte Sección 9.3.14, “Planificación regular de tareas” para cron(8) y crontab(1).

Aquí estan una relación con las suites de copias de seguridad más importantes en un sistema Debian.

Tabla 10.5. Relación de suites de utilidades de copias de respaldo

paquete popularidad tamaño descripción
dump V:1, I:7 341 4.4 BSD dump(8) y restore(8) para sistemas de archivos ext2/ext3/ext4
xfsdump V:0, I:11 838 dump y restore con xfsdump(8) y xfsrestore(8) para XFS sistemas de archivos en GNU/Linux e IRIX
backupninja V:4, I:4 329 sistema meta-backup extensible y ligero
bacula-common V:10, I:19 2055 Bacula: copia de respaldo en red, recuperación y verificación - archivos de apoyo comunes
bacula-client I:5 162 Bacula: copia de seguridad en red, recuperación y verificación - metapaquete cliente
bacula-console V:1, I:7 64 Bacula: copia de seguridad en red, recuperación y verificación - consola de texto
bacula-server I:2 165 Bacula: copia de seguridad en red, recuperación y verificación - metapaquete del servidor
amanda-common V:1, I:2 7419 Amanda: Archivador Automático de Discos en Red Avanzado Maryland (Bibliotecas)
amanda-client V:1, I:2 999 Amanda: Archivador Automático de Discos en Red Avanzado Maryland (Cliente)
amanda-server V:0, I:0 1047 Amanda: Archivador Automático de Discos en Red Avanzado Maryland (Servidor)
backup-manager V:1, I:2 543 herramienta de copia de seguridad en línea de órdenes
backup2l V:1, I:1 113 herramienta para medios externos para su copia/restauración con bajo mantenimiento (basado en discos)
backuppc V:4, I:5 2232 BackupPC sistema de copia de respadlo de PCs( basado en disco) de alto rendimiento y ámbito empresarial
duplicity V:8, I:15 1534 respaldo incremental (remoto)
flexbackup V:0, I:0 242 respaldo incremental (remoto)
rdiff-backup V:9, I:18 704 respaldo incremental (remoto)
restic V:0, I:0 11149 respaldo incremental (remoto)
rsnapshot V:6, I:12 452 respaldo incremental (remoto)
slbackup V:0, I:0 146 respaldo incremental (remoto)

Las herramientas de copias de seguridad están especializadas en diferentes aspectos.

Las herramientas básicas detalladas en Sección 10.1.1, “Herramientas de repositorios y compresión” and Sección 10.1.2, “Herramientas de sincronización y copia” pueden ser utilizadas para permiteir la copias de seguridad del sistema por medio de archivos de órdenes personalizados. Estos archivos de órdenes pueden ser mejorados como se muestra.

  • The restic package enables incremental (remote) backups.

  • El paquete rdiff-backup permite las copias de seguridad incrementales (en remoto).

  • El paquete dump ayuda en el archivo y restauración incremental del sistema de archivos completo de forma incremental y eficiente.

[Sugerencia] Sugerencia

Consulte los archivos en «/usr/share/doc/dump/» y «Es dump de verdad en deshuso?« para aprender sobre el paquete dump.

Para un sistema personal de escritorio Debian ejecutando «inestable», solo necesito proteger mis datos críticos personales. Reinstalo el sistema una vez al año siempre. Así es que no encuentro una razón para tener copias de seguridad del sistema completo o instalar una herramienta de copias de seguridad con todas las funcionalidades.

Utilizo un archivo de órdenes simple y lo grabo en un CD/DVD utilizando un interfaz gráfico de usuario. Aquí esta un ejemplo de un archivo de órdenes que realiza esta tarea.

#!/bin/sh -e
# Copyright (C) 2007-2008 Osamu Aoki <osamu@debian.org>, Public Domain
BUUID=1000; USER=osamu # UID and name of a user who accesses backup files
BUDIR=«/var/backups«
XDIR0=«.+/Mail|.+/Desktop«
XDIR1=«.+/\.thumbnails|.+/\.?Trash|.+/\.?[cC]ache|.+/\.gvfs|.+/sessions«
XDIR2=«.+/CVS|.+/\.git|.+/\.svn|.+/Downloads|.+/Archive|.+/Checkout|.+/tmp«
XSFX=«.+\.iso|.+\.tgz|.+\.tar\.gz|.+\.tar\.bz2|.+\.cpio|.+\.tmp|.+\.swp|.+~«
SIZE=«+99M«
DATE=$(date --utc +«%Y%m%d-%H%M«)
[ -d «$BUDIR« ] || mkdir -p «BUDIR«
umask 077
dpkg --get-selections \* > /var/lib/dpkg/dpkg-selections.list
debconf-get-selections > /var/cache/debconf/debconf-selections

{
find /etc /usr/local /opt /var/lib/dpkg/dpkg-selections.list \
     /var/cache/debconf/debconf-selections -xdev -print0
find /home/$USER /root -xdev -regextype posix-extended \
  -type d -regex «$XDIR0|$XDIR1« -prune -o -type f -regex «$XSFX« -prune -o \
  -type f -size  «$SIZE« -prune -o -print0
find /home/$USER/Mail/Inbox /home/$USER/Mail/Outbox -print0
find /home/$USER/Desktop  -xdev -regextype posix-extended \
  -type d -regex «$XDIR2« -prune -o -type f -regex «$XSFX« -prune -o \
  -type f -size  «$SIZE« -prune -o -print0
} | cpio -ov --null -O $BUDIR/BU$DATE.cpio
chown $BUUID $BUDIR/BU$DATE.cpio
touch $BUDIR/backup.stamp

Esto pretende ser un ejemplo de archivo de órdenes ejecutado como superusuario.

Espero que lo cambie y ejecute como se muestra.

¡Manténgalo simple!

[Sugerencia] Sugerencia

Puede recuperar la información de configuración de con «debconf-set-selections debconf-selections» y la selección de información de dpkg con «dpkg --set-selection <dpkg-selections.list».

Para el conjunto de información qeu se encuentra en árbol del directorio, la copia con «cp -a» proporciona una copia de respaldo normal.

Cuando se tiene gran cantidad de información estática que no se sobreescrite en un directorio como en el caso del directorio «/var/cache/apt/packages/», los enlaces duros con «cp -al» aporta una alternativa a la copia de respaldo normal consiguiendo un uso de espacio de disco eficiente.

Aquí esta una copia del archivo de órdenes, el cual he llamado bkup para las copias de respaldo. Este archivo de órdenes copia todos los archivos (no-CVS) contenidos por el directorio actual al directorio antiguo en el directorio padre o en el equipo remoto.

#!/bin/sh -e
# Copyright (C) 2007-2008 Osamu Aoki <osamu@debian.org>, Public Domain
fdot(){ find . -type d \( -iname «.?*« -o -iname «CVS« \) -prune -o -print0;}
fall(){ find . -print0;}
mkdircd(){ mkdir -p «$1«;chmod 700 «$1«;cd «$1«>/dev/null;}
FIND=«fdot«;OPT=«-a«;MODE=«CPIOP«;HOST=«localhost«;EXTP=«$(hostname -f)«
BKUP=«$(basename $(pwd)).bkup«;TIME=«$(date  +%Y%m%d-%H%M%S)«;BU=«$BKUP/$TIME«
while getopts gcCsStrlLaAxe:h:T f; do case $f in
g)  MODE=«GNUCP«;; # cp (GNU)
c)  MODE=«CPIOP«;; # cpio -p
C)  MODE=«CPIOI«;; # cpio -i
s)  MODE=«CPIOSSH«;; # cpio/ssh
t)  MODE=«TARSSH«;; # tar/ssh
r)  MODE=«RSYNCSSH«;; # rsync/ssh
l)  OPT=«-alv«;; # hardlink (GNU cp)
L)  OPT=«-av«;;  # copy (GNU cp)
a)  FIND=«fall«;; # find all
A)  FIND=«fdot«;; # find non CVS/ .???/
x)  set -x;; # trace
e)  EXTP=«${OPTARG}«;; # hostname -f
h)  HOST=«${OPTARG}«;; # user@remotehost.example.com
T)  MODE=«TEST«;; # test find mode
\?) echo «use -x for trace.«
esac; done
shift $(expr $OPTIND - 1)
if [ $# -gt 0 ]; then
  for x in $@; do cp $OPT $x $x.$TIME; done
elif [ $MODE = GNUCP ]; then
  mkdir -p «../$BU«;chmod 700 «../$BU«;cp $OPT . «../$BU/«
elif [ $MODE = CPIOP ]; then
  mkdir -p «../$BU«;chmod 700 «../$BU«
  $FIND|cpio --null --sparse -pvd ../$BU
elif [ $MODE = CPIOI ]; then
  $FIND|cpio -ov --null | ( mkdircd «../$BU«&&cpio -i )
elif [ $MODE = CPIOSSH ]; then
  $FIND|cpio -ov --null|ssh -C $HOST «( mkdircd \«$EXTP/$BU\«&&cpio -i )«
elif [ $MODE = TARSSH ]; then
  (tar cvf - . )|ssh -C $HOST «( mkdircd \«$EXTP/$BU\«&& tar xvfp - )«
elif [ $MODE = RSYNCSSH ]; then
  rsync -aHAXSv ./ «${HOST}:${EXTP}-${BKUP}-${TIME}«
else
  echo «Any other idea to backup?«
  $FIND |xargs -0 -n 1 echo
fi

Se trata de ejemplos de órdenes. Por favor lea el archivo de órdenes y modifiquelo usted mismo para adaptarlo a sus necesidades.

[Sugerencia] Sugerencia

Mantengo mi bkup en el directorio «/usr/local/bin/». Ejecuto la órden bkup sin ningún argumento cuando necesito una imagen temporal del directorio de trabajo.

[Sugerencia] Sugerencia

Para mantener un histórico de imágenes en un árbol de archivos o en un árbol de archivos de configuración, es fácil y eficiente en la utilización del espacio utilizar git(7) (see Sección 10.6.5, “Git para guardar el histórico de configuraciones”).

La infraestructura de seguridad de la información es una combinación de herramientas de cifrado de datos, herramientas de resúmenes de mensajes y herramientas de firma.


Consulte Sección 9.8, “Trucos para cifrar información” en dm-crypto y ecryptfs para la implementación de una infraestructura de cifrado de información automática por medio de los módulos del núcleo de Linux.

Aquí están las órdenes GNU Privacy Guard para la gestión básica de claves.


Aquí esta el significado de un código seguro.


Lo siguiente carga mi clave «1DD8D791» a un popular servidor de claves «hkp://keys.gnupg.net».

$ gpg --keyserver hkp://keys.gnupg.net --send-keys 1DD8D791

Un buen servidor de claves por defecto configurado en «~/.gnupg/gpg.conf» (o su ubicación antigua «~/.gnupg/options») contiene lo siguiente.

keyserver hkp://keys.gnupg.net

Lo siguiente obtiene las claves desconocidas del servidor de claves.

$ gpg --list-sigs --with-colons | grep '^sig.*\[User ID not found\]' |\
  cut -d ':' -f 5| sort | uniq | xargs gpg --recv-keys

Existió un error en el Servidor de Claves Públicas OpenPGP (pre versión 0.9.6) el cual corrompia las claves con más de dos subclaves. El nuevo paquete gnupg (>1.2.1-2) pueden gestionar estas subclaves corruptas. Consulte gpg(1) bajo la opción «--repair-pks-subkey-bug».

Aquí estan los ejemplos de utilización de las órdenes GNU Privacy Guard sobre archivos.


md5sum(1) proporciona la funcionalidad de hacer resumenes de un archivo utilizando el método descrito en rfc1321 y verificar cada archivo con él.

$ md5sum foo bar >baz.md5
$ cat baz.md5
d3b07384d113edec49eaa6238ad5ff00  foo
c157a79031e1c40f85931829bc5fc552  bar
$ md5sum -c baz.md5
foo: OK
bar: OK
[Nota] Nota

La computación de la suma MD5 es menos intensiva en CPU que la de firma criptográfica de GNU Privacy Guard (GnuPG). Normalmente, solo los archivos resumen de alto nivel están firmados criptologicamente para asegurar la integridad de la información.

Existen múltiples herramientas para el código fuente. Las siguientes órdenes llamaron mi atención.

Tabla 10.10. Relación de las herramientas para mezclar código fuente

paquete popularidad tamaño orden descripción
diffutils V:857, I:981 1394 diff(1) compara archivos línea a línea
diffutils V:857, I:981 1394 diff3(1) compara y mezcla tres archivos línea a línea
vim V:122, I:392 2470 vimdiff(1) compare dos archivos en vim uno contra otro
patch V:98, I:857 216 patch(1) aplica un archivo diff al original
dpatch V:1, I:16 191 dpatch(1) gestiona un conjunto de parches para paquetes Debian
diffstat V:21, I:186 70 diffstat(1) produce un histográma de los cambios de diff
patchutils V:20, I:179 223 combinediff(1) crea un parche acumulativo con dos parches incrementales
patchutils V:20, I:179 223 dehtmldiff(1) extrae un diff de un página HTML
patchutils V:20, I:179 223 filterdiff(1) extrae o excluye diffs de un archivo diff
patchutils V:20, I:179 223 fixcvsdiff(1) repara archivos diff creados por CVS que son malinterpretados por patch(1)
patchutils V:20, I:179 223 flipdiff(1) intercambia el orden de dos parches
patchutils V:20, I:179 223 grepdiff(1) muestra que archivos son modificados por un parche de acuerdo a una expresión regular
patchutils V:20, I:179 223 interdiff(1) muestra las diferencias entre dos archivos diff unificados
patchutils V:20, I:179 223 lsdiff(1) muestra los archivos modificados por un parche
patchutils V:20, I:179 223 recountdiff(1) recalcula las cuentas y desplazamientos en un contexto diff unificado
patchutils V:20, I:179 223 rediff(1) repara los desplazamientos y cuentas en un diff editado de forma manual
patchutils V:20, I:179 223 splitdiff(1) selecciona parches incrementales
patchutils V:20, I:179 223 unwrapdiff(1) deshace los parches que han sido mezclados
wiggle V:0, I:0 166 wiggle(1) aplica parches rechazados
quilt V:4, I:43 711 quilt(1) gestiona un conjunto de parches
meld V:15, I:41 3115 meld(1) compara y mezcla archivos (GTK)
dirdiff V:0, I:2 144 dirdiff(1) muestra las diferencias y mezcla los cambios entre árboles de directorio
docdiff V:0, I:0 573 docdiff(1) compara dos archivos palabra a palabra / caracter a caracter
imediff2 V:0, I:0 34 imediff2(1) herramienta para mezclar de forma interactiva con la pantalla completa dividida en dos
makepatch V:0, I:0 102 makepatch(1) genera archivos de parches extendidos
makepatch V:0, I:0 102 applypatch(1) aplica archivos de parches extendidos
wdiff V:5, I:81 643 wdiff(1) muestra las palabras diferentes en dos archivos de textos

Aquí está un resumen de los sistemas de control de versiones (CVS) en el sistema Debian.

[Nota] Nota

Si no tiene experiencia con sistemas CVS, podría empezar a aprender Git, el cual es muy popular.


A CVS también se le denomina Sistema de Control de Revisiones (RCS) o Software de Gestión de la Configuración (SCM).

Los sistemas CVS distribuidos como Git son las herramientas comunes hoy en dia. CVS y Subversión son todavía útiles en la gestión de ciertas actividades de código abierto.

Debian proporciona servicios CVS libres a través de Servicio Alioth de Debian. Soporta practicamente todos los CVS. Su documentación puede encontrarse en http://wiki.debian.org/Alioth.

Existen unos pocos fundamentos para la creación de un archivo CVS compartido.

Aquí se muestra una simplificación extrema de las órdenes propias de cada CVS para proporcionar una visión de conjunto. La secuencia de órdenes normal puede necesitar de opciones o parámetros.


[Atención] Atención

LLamar una subórden git directamento como «git-xyz» desde la línea de órdenes ha sido declarado obsoleto desde principios de 2006.

[Sugerencia] Sugerencia

Si existe un archivo ejecutable git-foo en la ruta determinada por $PATH, el escribir «git foo» sin guión en la línea de órdenes llama a git-foo. Esto es una funcionalidad de la órden git.

[Sugerencia] Sugerencia

Las herramientas GUI como tkcvs(1) y gitk(1) son realmente útiles en el seguimiento del histórico de archivos. El interfaz web que proporcionan muchos archivos públicos en sus repositorios son también muy útilies al permitir navegar por ellos.

[Sugerencia] Sugerencia

Git puede trabajar con diferentes repositorios como los de CVS y Subversión y proporciona un repositorio local para cambio locales por medio de los paquetes git-cvs y git-svn. Consulte Git para usuarios de CVS y Sección 10.6.4, “Git para repositorios Subversion”.

[Sugerencia] Sugerencia

En git existen órdenes que no poseen equivalente en CVS y Subversion como «fetch«, «rebase«, «cherry-pick«, …

Git puede realizan cualquier operación en el código fuente tanto el local como en remoto. Esto significa que puede guardar los cambios en el código fuente sin tener conexión de red al repositorio remoto.

Consulte lo siguiente.

Las órdenes git-gui(1) y gitk(1) hacen que Git sea muy fácil de utilizar.

[Aviso] Aviso

No utilice etiquetas con caracteres blancos a pesar de que algunas herramientas permiten su utilización como gitk(1). Puede provocar errores en otras órdenes git.

Incluso cuando el servidor es otro CVS, puede ser una buena idea utilizar git(1) para la operaciones locales ya que permite gestionar la copia local del árbol del código fuente sin una conexión de red al servidor. Aquí estan algunos paquetes y órdenes utilizados con git(1).


[Sugerencia] Sugerencia

Con git(1), puedes trabajar en una rama local con varios compromisos del código (commits) y utilizar algo similar a «git rebase -i master» para reorganizar más tarde el histórico de cambios. Esto permite un histórico de cambios limpio. Consulte git-rebase(1) y git-cherry-pick(1).

[Sugerencia] Sugerencia

Cuando quiera bolver a un directorio de trabajo limpio sin perder el estado actual del directorio de trabajo, puede utilizar «git stash». Consulte git-stash(1).

Puede guardar manualmente la cronología de histórico de configuraciones utilizando las herramientas Git. Aquí esta un ejemplo simple para guardad el contenido de «/etc/apt/» de una forma práctica.

$ cd /etc/apt/
$ sudo git init
$ sudo chmod 700 .git
$ sudo git add .
$ sudo git commit -a

Comprometes la configuración con la descripción.

Hacer modificaciones a los archivos de configuración.

$ cd /etc/apt/
$ sudo git commit -a

Compromete la configuración con la descripción y continua con su vida.

$ cd /etc/apt/
$ sudo gitk --all

Usted tiene el histórico completo de la configuración con usted.

[Nota] Nota

sudo(8) es necesario para trabajar con todos los permisos de archivo de los datos de configuración. Para los datos de configuración del usuario, puede evitar la utilización sudo.

[Nota] Nota

Se necesita la órden «chmod 700 .git» en el ejemplo anterior para proteger los datos del archivo de lecturas no autorizadas.

[Sugerencia] Sugerencia

Para un despliege completo del guardado del histórico de la configuración, por favor compruebe el paquete etckeeper: Sección 9.2.10, “Guardando cambios en los archivos de configuración”.

Consulte lo siguiente.

  • cvs(1)

  • «/usr/share/doc/cvs/html-cvsclient»

  • «/usr/share/doc/cvs/html-info»

  • «/usr/share/doc/cvsbook»

  • «info cvs»

La mayoría de los servidores CVS públicos proporcionan acceso remoto de solo lectura con el nombre de cuenta «anonymous» a través del servicio. Por ejemplo, el contenido del sitio web de Debian es mantenido por el proyecto webwml a través del servicio de Debian alioth. Lo siguiente configura «$CVSROOT» para el acceso remoto de este repositorio CVS.

$ export CVSROOT=:pserver:anonymous@anonscm.debian.org:/cvs/webwml
$ cvs login
[Nota] Nota

Ya que pserver es propenso a ataques de escucha e inseguro, el acceso de escritura normalmente esta deshabilitado por los administradores del servidor.

La siguiente configuración de «$CVS_RSH» y «$CVSROOT» para el acceso remoto para el repositorio CVS por el proyecto webwml con SSH.

$ export CVS_RSH=ssh
$ export CVSROOT=:ext:account@cvs.alioth.debian.org:/cvs/webwml

Puede utilizar tambien una clave pública para acreditarse por SSH el cual elimina el acceso remoto con contraseña.

Aquí esta un ejemplo paradigmático de flujo de trabajo con CVS.

Compruebe que todos los módulos disponibles del proyecto en el CVS son referenciados por «$CVSROOT» como se muestra.

$ cvs rls
CVSROOT
module1
module2
...

Compruebe «module1» en su directorio por defecto «./module1» como se muestra.

$ cd ~/path/to
$ cvs co module1
$ cd module1

Haga los cambios que se necesiten en el contenido.

Compruebe los cambios haciendo el equivalente a «diff -u [repositorio] [local]» como se muestra.

$ cvs diff -u

Encontrará que ha comedito errores en algunos archivos «archivo_a_deshacer» y que otros archivos son correctos.

Sobreescrita el archivo «archivo_a_deshacer» con una copia la copia en buen estado del repositorios CVS como se muestra.

$ cvs up -C archivo_a_deshacer

Guarde el árbol local actualizado en CVS como se muestra.

$ cvs ci -m «Descripción del cambio«

Cree y añada el archivo «archivo_para_añadir» al CVS como se muestra.

$ vi archivo_a_añadir
$ cvs add archivo_a_añadir
$ cvs ci -m «Añadido archivo_a_añadir«

Mezcle la última versión del CVS como se muestra.

$ cvs up -d

Vigile las líneas que empiezan por «C filename» ya que indican cambios conflictivos.

Mire el código que no se ha modificado en «.#nombre_del_archivo.version».

Los cambios conflictivos en los archivos los puede encontrar buscando por la cadena «<<<<<<<» y «>>>>>>>».

Modifique los archivos para resolver los conflictos según necesite.

Añada una etiqueta de distribución «Liberación-1» como se muestra.

$ cvs ci -m «último compromiso de la Liberación-1«
$ cvs tag Liberación-1

Editelo para continuar.

Borre la etiqueta de publicación «Liberación-1» como se muestra.

$ cvs tag -d Liberación-1

Compruebe los cambios del CVS como se muestra.

$ cvs ci -m «Últimos cambios comprometidos para la Liberación-1«

Vuelva a añadir al etiqueta de la publicación «Liberación-1» para actualizalar la cabecera CVS (CVS HEAD) del raíz como se muestra.

$ cvs tag Liberación-1

Crea una rama poniendo una marca persistente ('sticky') de rama «Correción-Liberación-inicial» a partir de la versión original apuntada por la etiqueta «Liberación-inicial» haga una comprobación de ella en el antiguo directorio «~/camino/al/antiguo» de la siguiente manera.

$ cvs rtag -b -r Liberación-inicial Correción-Liberación-inicial module1
$ cd ~/ruta/a
$ cvs co -r Correción-Liberación-inicial -d antiguo module1
$ cd antiguo
[Sugerencia] Sugerencia

Utilice «-D 2005-12-20» (formato de fecha ISO 8601) para especificar una fecha particular como un hito en la rama en lugar de «-r Lineración-inicial».

Trabaje en esta parte del árbol local teniendo como como etiqueta por defecto «Corrección-Liberación-inicial» la cual está basada en su versión original.

Trabaje en esta rama ... hasta que alguien más se una a la rama «CorrecciónLiberación-inicial».

Sincronize los archivos modificados con otros en el rama y cree los archivos que necesite como se muestra.

$ cvs up -d

Modifique los archivos para resolver los conflictos según necesite.

Compruebe los cambios del CVS como se muestra.

$ cvs ci -m «comprobado en esta rama«

Actualice el árbol local con el HEAD del principal mientras borra la etiqueta por defecto («-A») y sin la expansion del teclado («-kk») como se muestra.

$ cvs up -d -kk -A

Actualice el árbol local (contenido = raíz del principal) por la mezcla de la rama «Corrección-Liberación-inicial» y sin la expansión de teclado como se muestra.

$ cvs up -d -kk -j Corrección-Liberación-inicial

Corrija los conflictos con el editor.

Compruebe los cambios del CVS como se muestra.

$ cvs ci -m «Corrección-Liberación-inicial mezclada«

Realice el archivado como se muestra.

$ cd ..
$ mv antiguo corrección-antiguo-module1
$ tar -cvzf corrección-antiguo-module1.tar.gz corrección-antiguo-module1
$ rm -rf corrección-antiguo-module1
[Sugerencia] Sugerencia

La órden «cvs up» puede tener la opción «-d» para crear nuevos directorios y la opción «-P» para eliminar los directorios vacios.

[Sugerencia] Sugerencia

Puede comprobar únicamente el subdirectorio «module1» dando su nombre como «cvs co module1/subdirectorio».


Subversion es un sistema de control de versiones de una generación más reciente que puede ser el sustituto del antiguo CVS. Tiene la mayor parte de las funcionalidades de CVS excepto las de etiquetas y ramas.

Necesita instalar los paquetes subversion, libapache2-svn y subversion-tools para instalar un servidor de Subversion.

Aquí esta un ejemplo de flujo de trabajo estándar utilizando Subversion con su cliente nativo.

[Sugerencia] Sugerencia

La órden cliente que aporta el paquete git-svn puede ofrecer un flujo de trabajo alternativo de Subversion utilizando la órden git. Consulte Sección 10.6.4, “Git para repositorios Subversion”.

Enumere todos los módulos disponibles del proyecto Subversión que se referencias por la URL «file:///srv/svn/proyecto» como se muestra.

$ svn list file:///srv/svn/proyecto
module1
module2
...

Compruebe «module1/trunk» al directorio «module1» como se muestra.

$ cd ~/ruta/al
$ svn co file:///srv/svn/proyecto/module1/trunk module1
$ cd module1

Haga los cambios que se necesiten en el contenido.

Compruebe los cambios haciendo el equivalente a «diff -u [repositorio] [local]» como se muestra.

$ svn diff

Encontrará que ha comedito errores en algunos archivos «archivo_a_deshacer» y que otros archivos son correctos.

Sobreescriba «archivo_a_deshacer» con una copia limpia de Subversion como se muestra.

$ svn revert archivo_a_deshacer

Guarde un árbol local actualizado en Subversión como se muestra.

$ svn ci -m «Descripción del cambio«

Cree y añada un archivo «archivo_a_añadir» como se muestra.

$ vi archivo_a_añadir
$ svn add archivo_a_añadir
$ svn ci -m «Añadido archivo archivo_a_añadir«

Mezcle la última versión de Subversion como se muestra.

$ svn up

Vigile las líneas que empiezan por «C filename» ya que indican cambios conflictivos.

MIre el código no modificado en p. ej. «nombre_de_archivo.r6», «nombre_de_archivo.r9» y «nombre_de_archivo.mio».

Los cambios conflictivos en los archivos los puede encontrar buscando por la cadena «<<<<<<<» y «>>>>>>>».

Modifique los archivos para resolver los conflictos según necesite.

Añada una etiqueta de distribución «Liberación-1» como se muestra.

$ svn ci -m «Última entrega para la Liberación-1«
$ svn cp file:///srv/svn/proyecto/module1/trunk file:///srv/svn/proyecto/module1/tags/Liberación-1

Editelo para continuar.

Borre la etiqueta de publicación «Liberación-1» como se muestra.

$ svn rm file:///srv/svn/proyecto/module1/tags/Liberación-1

Comprometa los cambios en Subversion como se muestra.

$ svn ci -m «Realmente la última entrega para la Liberación-1«

Vuelva a añadir al etiqueta de liberación «Liberación-1» de la cabeza de «trunk« de la versión actualizada de Subversion como se muestra.

$ svn cp file:///srv/svn/proyecto/module1/trunk file:///srv/svn/proyecto/module1/tags/Liberación-1

Creee una rama con la ruta «module1/ramas/Corrección-Liberación-inicial» de la versión original referenciada por la ruta «module1/etiquetas/Liberación-inicial» y compruebela en el directorio «~/ruta/al/antiguo» como se muestra.

$ svn cp file:///srv/svn/proyecto/module1/etiquetas/LIberación-inicial file:///srv/svn/proyecto/module1/ramas/Corrección-Liberación-inicial
$ cd ~/ruta/a
$ svn co file:///srv/svn/proyecto/module1/ramas/corrección-Liberación-inicial antiguo
$ cd antiguo
[Sugerencia] Sugerencia

Utilice «module1/trunk@{2005-12-20}» (formato de fecha ISO 8601) en vez de «module1/tags/Liberación-inicial» para especificar una fecha determinada como punto de bifurcación.

Trabaje en este árbol local que refencia a la rama «Corrección-Liberación-inicial» la cual esta basada en la versión original.

Trabaje en esta rama ... hasta que alguien más se una a la rama «CorrecciónLiberación-inicial».

Sincronice los archivos modificados por tercereos en esta rama como se muestra.

$ svn up

Modifique los archivos para resolver los conflictos según necesite.

Comprometa los cambios en Subversion como se muestra.

$ svn ci -m «Comprobando esta rama«

Actualice el árbol local con el comienzo de trunk como se muestra.

$ svn switch file:///srv/svn/proyecto/module1/trunk

Actualice el árbol local (contenido = raíz de «trunk«) mezclandolo con la rama «Corrección-Liberación-inicial» como se muestra.

$ svn merge file:///srv/svn/proyecto/module1/ramas/Corrección-Liberación-inicial

Corrija los conflictos con el editor.

Comprometa los cambios en Subversion como se muestra.

$ svn ci -m «Corrección-Liberación-inicial mezclada«

Realice el archivado como se muestra.

$ cd ..
$ mv antiguo corrección-antiguo-module1
$ tar -cvzf corrección-antiguo-module1.tar.gz corrección-antiguo-module1
$ rm -rf corrección-antiguo-module1
[Sugerencia] Sugerencia

Puede sustituir las URLs del tipo «file:///…» por otros formatos de URLs como «http://…» y «svn+ssh://…».

[Sugerencia] Sugerencia

Puede comprobar unicamente un subdirectorio de «module1» proporcionando su nombre como en «svn co file:///srv/svn/proyecto/module1/trunk/subdir module1/subdir», etc.