Capitolo 10. Gestione dei dati

Indice

10.1. Condividere, copiare ed archiviare
10.1.1. Strumenti di archiviazione e compressione
10.1.2. Strumenti di copia e sincronizzazione
10.1.3. Esempi di invocazione per archivi
10.1.4. Esempi di invocazione per la copia
10.1.5. Esempi di invocazione per la selezione di file
10.1.6. Supporti di archiviazione
10.1.7. Supporti di archiviazione removibili
10.1.8. Scelta del file system per la condivisione di dati
10.1.9. Condividere dati attraverso una rete
10.2. Backup e ripristino
10.2.1. Suite con utilità di backup
10.2.2. Uno script di esempio per il backup di sistema
10.2.3. Uno script di copia per backup di dati
10.3. Infrastruttura di sicurezza dei dati
10.3.1. Gestione delle chiavi per GnuPG
10.3.2. Usare GnuPG su file
10.3.3. Usare GnuPG con Mutt
10.3.4. Usare GnuPG con Vim
10.3.5. Somme di controllo MD5
10.4. Strumenti per la fusione di codice sorgente
10.4.1. Estrarre differenze da file sorgenti
10.4.2. Fondere aggiornamenti per file sorgenti
10.4.3. Aggiornare con fusioni a 3 vie
10.5. Sistemi di controllo delle versioni
10.5.1. Comparazione di comandi VCS
10.6. Git
10.6.1. Configurazione del client Git
10.6.2. Documenti di consultazione per Git
10.6.3. Comandi Git
10.6.4. Git per repository Subversion
10.6.5. Git per registrare la cronologia della configurazione
10.7. CVS
10.7.1. Configurazione di archivi CVS
10.7.2. Accesso locale al CVS
10.7.3. Accesso remoto a CVS con pserver
10.7.4. Accesso remoto a CVS con ssh
10.7.5. Importare un nuovo sorgente in CVS
10.7.6. Permessi dei file negli archivi CVS
10.7.7. Sequenza di azioni tipiche nell'uso di CVS
10.7.8. File più recenti dal CVS
10.7.9. Amministrazione del CVS
10.7.10. Bit di esecuzione per il checkout CVS
10.8. Subversion
10.8.1. Configurazione di archivi Subversion
10.8.2. Accedere a Subversion tramite il server Apache2
10.8.3. Accesso locale a Subversion da parte di un gruppo
10.8.4. Accesso remoto a Subversion con SSH
10.8.5. Struttura delle directory di Subversion
10.8.6. Importare un nuovo sorgente in Subversion
10.8.7. Sequenza di azioni tipiche nell'uso di Subversion

In questo capitolo sono descritti strumenti e trucchi per gestire dati binari e di testo in un sistema Debian.

[Avvertimento] Avvertimento

L'accesso in scrittura non coordinato a device a cui si sta attivamente accedendo e a file da parte di processi diversi deve essere evitato per prevenire le race condition. Per evitare ciò devono essere usati i meccanismi di lock dei file utilizzando flock(1).

La sicurezza dei dati e la loro condivisione controllata hanno diversi aspetti.

  • La creazione di archivi di dati

  • L'accesso ad archivi remoti

  • La duplicazione

  • Il tenere traccia della cronologia delle modifiche

  • La facilitazione della condivisione dei dati

  • Il prevenire l'accesso non autorizzato ai file

  • La rilevazione di modifiche non autorizzate ai file

Queste azioni possono essere realizzate usando una combinazione di strumenti.

  • Strumenti di archiviazione e compressione

  • Strumenti di copia e sincronizzazione

  • file system di rete

  • Supporti di archiviazione removibili

  • Secure Shell

  • Il sistema di autenticazione

  • Strumenti per sistemi di controllo delle versioni

  • Strumenti crittografici per hash e cifratura

Ecco una tabella riassuntiva degli strumenti di archiviazione e compressione disponibili per il sistema Debian.

Tabella 10.1. Elenco di strumenti di archiviazione e compressione

pacchetto popcon dimensione estensione comando commento
tar V:908, I:999 2770 .tar tar(1) strumento di archiviazione standard (standard de facto)
cpio V:305, I:998 720 .cpio cpio(1) strumento di archiviazione Unix in stile System V, da usare con find(1)
binutils V:177, I:715 23348 .ar ar(1) strumento di archiviazione per la creazione di librerie statiche
fastjar V:5, I:56 172 .jar fastjar(1) strumento di archiviazione per Java (simile a zip)
pax V:17, I:54 170 .pax pax(1) nuovo strumento POSIX di archiviazione, compromesso tra tar e cpio
gzip V:877, I:999 231 .gz gzip(1), zcat(1), … utilità GNU di compressione LZ77 (standard de facto)
bzip2 V:238, I:933 184 .bz2 bzip2(1), bzcat(1), … utilità per compressione con ordinamento dei blocchi Burrows-Wheeler con maggiore rapporto di compressione di gzip(1) (più lenta di gzip con sintassi simile)
lzma V:4, I:60 126 .lzma lzma(1) utilità di compressione LZMA con maggiore rapporto di compressione di gzip(1) (deprecata)
xz-utils V:322, I:952 516 .xz xz(1), xzdec(1), … utilità di compressione XZ con maggiore rapporto di compressione di bzip2(1) (più lenta di gzip, ma più veloce di bzip2; sostituto dell'utilità di compressione LZMA)
p7zip V:38, I:175 934 .7z 7zr(1), p7zip(1) strumento di archiviazione file 7-Zip con alto rapporto di compressione (compressione LZMA)
p7zip-full V:175, I:527 4407 .7z 7z(1), 7za(1) strumento di archiviazione file 7-Zip con alto rapporto di compressione (compressione LZMA e altre)
lzop V:5, I:44 97 .lzo lzop(1) utilità di compressione LZO con velocità di compressione e decompressione più alta di quella di gzip(1) (più basso rapporto di compressione di gzip con sintassi simile)
zip V:47, I:395 608 .zip zip(1) InfoZIP: strumento di archiviazione e compressione per DOS
unzip V:271, I:791 534 .zip unzip(1) InfoZIP: strumento di estrazione di archivi e decompressione per DOS

[Avvertimento] Avvertimento

Non impostare la variabile "$TAPE" a meno che non si sappia esattamente cosa aspettarsi. Cambia il comportamento di tar(1).

[Nota] Nota

Gli archivi tar(1) compressi con gzip usano l'estensione di file ".tgz" o ".tar.gz".

[Nota] Nota

Gli archivi tar(1) compressi con xz usano l'estensione di file ".txz" o ".tar.xz".

[Nota] Nota

La popolarità dei metodi di compressione negli strumenti FOSS come tar(1) è cambiata nel tempo nel modo seguente gzipbzip2xz

[Nota] Nota

cp(1), scp(1) e tar(1) possono avere alcune limitazioni per file speciali. cpio(1) è più versatile.

[Nota] Nota

cpio(1) è progettato per essere usato con find(1) ed altri comandi adatti per creare script di backup, dato che la porzione di selezione dei file dello script può essere testata in modo autonomo.

[Nota] Nota

La struttura interna dei file di dati di LibreOffice è quella dei file ".jar".

Ecco una tabella riassuntiva dei semplici strumenti di copia e backup disponibili in un sistema Debian.


La copia dei file con rsync(8) offre un insieme di funzionalità più ricco di altri strumenti.

  • l'algoritmo delta-transfer, che invia solamente le differenze tra il file sorgente ed il file esistente nella destinazione

  • algoritmo veloce di verifica (predefinito) che cerca i file la cui dimensione o il cui orario di ultima modifica sono cambiati

  • opzioni "--exclude" e "--exclude-from" simili a quelle di tar(1)

  • sintassi con "una barra / alla fine della directory sorgente" che evita di dover creare un livello aggiuntivo di directory nella destinazione

[Suggerimento] Suggerimento

L'esecuzione, tramite cron(8), dello script bkup citato in Sezione 10.2.3, «Uno script di copia per backup di dati» con l'opzione "-gl", dovrebbe fornire funzionalità moltio simili a dumpfs di Plan9 per un archivio di dati statici.

[Suggerimento] Suggerimento

Gli strumenti di controllo delle versioni VCS (Version control system) in Tabella 10.11, «Elenco di strumenti per sistemi di controllo delle versioni» possono essere usati come strumenti di copia e sincronizzazione multidirezionali.

Ecco diversi modi di copiare l'intero contenuto della directory "./sorgente", usando diversi strumenti.

  • Copia locale: directory "./sorgente" → directory "/dest"

  • Copia remota: directory "./sourgente" sull'host locale → directory "/dest" sull'host "utente@host.dom"

rsync(8):

# cd ./sorgente; rsync -aHAXSv . /dest
# cd ./sorgente; rsync -aHAXSv . utente@host.dom:/dest

In alternativa si può usare la sintassi con "una barra / alla fine della directory sorgente".

# rsync -aHAXSv ./sorgente/ /dest
# rsync -aHAXSv ./sorgente/ utente@host.dom:/dest

In alternativa usare i comandi seguenti.

# cd ./sorgente; find . -print0 | rsync -aHAXSv0 --files-from=- . /dest
# cd ./sorgente; find . -print0 | rsync -aHAXSv0 --files-from=- . utente@host.dom:/dest

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

# cd ./sorgente; cp -a . /dest
# cd ./sorgente; scp -pr . utente@host.dom:/dest

GNU tar(1):

# (cd ./sorgente && tar cf - . ) | (cd /dest && tar xvfp - )
# (cd ./sorgente && tar cf - . ) | ssh utente@host.dom '(cd /dest && tar xvfp - )'

cpio(1):

# cd ./sorgente; find . -print0 | cpio -pvdm --null --sparse /dest

In tutti gli esempi contenenti ".", si può sostituire "." con "pippo" per copiare i file dalla directory "./sorgente/pippo" alla directory "/dest/pippo".

In tutti gli esempi contenenti ".", si può sostituire "." con il percorso assoluto "/percorso/di/sorgente/pippo" per evitare di fare "cd ./sorgente;". I file verranno copiati in posizioni diverse a seconda dello strumento utilizzato, come descritto qui di seguito.

  • in "/dest/pippo": rsync(8), GNU cp(1) e scp(1)

  • "/dest/percorso/di/sorgente/pippo": GNU tar(1) e cpio(1)

[Suggerimento] Suggerimento

rsync(8) e GNU cp(1) hanno l'opzione "-u" per saltare i file che sono più recenti nella destinazione.

find(1) viene usato per selezionare i file per i comandi di archiviazione e copia (vedere Sezione 10.1.3, «Esempi di invocazione per archivi» e Sezione 10.1.4, «Esempi di invocazione per la copia») o per xargs(1) (vedere Sezione 9.3.9, «Ripetere un comando su diversi file»). Questo funzionamento può essere migliorato usando le sue opzioni di comando.

La sintassi base di find(1) può essere riassunta nel modo seguente.

  • Gli argomenti condizionali sono valutati da sinistra a destra.

  • Questa valutazione si ferma una volta che il risultato è determinato.

  • L'operatore "OR logico" (specificato con "-o" tra condizioni) ha una precedenza più bassa dell'operatore "AND logico" (specificato da "-a" o dall'assenza di un operatore tra condizioni).

  • L'operatore "NOT logico" (specificato da "!" prima di una condizione) ha una precedenza più alta di un operatore "AND logico".

  • L'opzione "-prune" restituisce sempre una condizione di VERO logico e, se si tratta di una directory, la ricerca si ferma a questo punto.

  • L'opzione "-name trova corrispondenze con il nome base del file tramite espressioni glob di shell (vedere Sezione 1.5.6, «Glob della shell»), ma fa corrispondenza anche con il carattere iniziale "." con l'uso di metacaratteri come "*" e "?". (Nuova funzionalità POSIX.)

  • L'opzione "-regex" trova corrispondenze con il percorso completo usando, in modo predefinito, BRE in stile emacs (vedere Sezione 1.6.2, «Espressioni regolari»).

  • L'opzione "-size" trova corrispondenze con file in base alla loro dimensione (valori preceduti da "+" o "-" per cercare dimensioni, rispettivamente, più grandi o piccole del valore).

  • L'opzione "-newer" trova corrispondenze con file più recenti di quello specificato come argomento dell'opzione.

  • L'opzione "-print0" restituisce sempre il valore logico VERO e stampa il nome file completo (terminato dal carattere null) sullo standard output.

find(1) è spesso usato con uno stile di invocazione come il seguente.

# find /path/to \
    -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

Il comando precedente si traduce nelle azioni seguenti.

  1. Cercare tutti i file a partire da "/percorso/di"

  2. Limitare globalmente la ricerca al file system da cui è richiamato e usare espressioni regolari ERE (vedere Sezione 1.6.2, «Espressioni regolari»)

  3. Escludere i file che corrispondono all'espressione regolare ".*\.cpio" o ".*~" dalla ricerca fermando la loro elaborazione

  4. Escludere le directory che corrispondono all'espressione regolare ".*/\.git" dalla ricerca fermando la loro elaborazione

  5. Escludere i file più grandi di 99 Megabyte (unità di 1048576 byte) dalla ricerca fermando la loro elaborazione

  6. Stampare i nomi di file che soddisfano le condizioni di ricerca precedenti e che siano più recenti di "/percorso/di/marcaturaorario"

Notare nell'esempio precedente l'uso della parte di comando "-prune -o per escludere file.

[Nota] Nota

Alcune opzioni per find(1) potrebbero non essere supportate per i sistemi *nix non Debian. In questi casi, cambiare le invocazioni in quelle adatte corrispondenti e sostituire "-print0" con "-print". Potrebbe essere necessario modificare anche comandi correlati.

Quando si deve scegliere il supporto di archiviazione di dati informatici per un importante archivio di dati, si dovrebbe porre attenzione alle limitazioni dei supporti. Per piccoli backup di dati personali, io uso CD-R e DVD-R scegliendoli in base alla marca del produtttore e conservandoli in un ambiente fresco, all'ombra, asciutto e pulito. (I supporti di archiviazione a nastro sembrano molto popolari per gli usi professionali.)

[Nota] Nota

Le casseforti a prova di fuoco sono pensate per i documenti cartacei. La maggior parte dei supporti di archiviazione di dati informatici ha una tolleranza più bassa alle alte temperature rispetto alla carta. Di solito mi affido a copie multiple cifrate sicure conservate in diverse posizioni sicure.

Durata di vita ottimistica di diversi supporti di archiviazione da dati raccolti in rete (per lo più dalle informazioni dei produttori).

  • 100+ anni: carta senza acidi con inchiostro

  • 100 anni: supporti ottici (CD/DVD, CD/DVD-R)

  • 30 anni: supporti magnetici (nastri, dischetti floppy)

  • 20 anni: supporti ottici a cambio di fase (CD-RW)

Questi tempi non tengono conto dei danni meccanici causati dal maneggiamento, ecc.

Cicli di scrittura ottimistici di diversi supporti di archiviazione da dati raccolti in rete (per lo più dalle informazioni dei produttori).

  • 250,000+ cicli: unità a disco fisso

  • 10,000+ cicli: memoria flash

  • 1,000 cicli: CD/DVD-RW

  • 1 ciclo: CD/DVD-R, carta

[Attenzione] Attenzione

I valori di durata di vita e dei cicli di scrittura riportati non dovrebbero essere usati per prendere decisioni riguardo all'archiviazione di dati critici. Consultare le informazioni specifiche per ciascun prodotto forniti dal produttore.

[Suggerimento] Suggerimento

Dato che i CD/DVD-R e la carta hanno un solo ciclo di scrittura, prevengono per loro stessa natura le perdite accidentali di dati per sovrascrittura. Questo è un vantaggio!

[Suggerimento] Suggerimento

Se è necessario fare backup frequenti e veloci di una grande quantità di dati, un disco fisso su un host remoto connesso con una connessione veloce, potrebbe essere l'unica soluzione realistica.

Un support di archiviazione removibile può essere uno dei seguenti.

Possono essere connessi in uno dei modi seguenti.

Gli ambienti desktop moderni, come GNOME e KDE, possono montare questi dispositivi removibili automaticamente senza una voce corrispondente in "/etc/fstab".

  • Il pacchetto udisks fornisce un demone e le utilità associate per montare e smontare questi dispositivi.

  • D-bus crea eventi per dare inizio ai processi automatici.

  • PolicyKit fornisce i privilegi necessari.

[Suggerimento] Suggerimento

I dispositivi montati automaticamente hanno l'opzione di mount "uhelper=" che viene usata da umount(8).

[Suggerimento] Suggerimento

Nei moderni ambienti desktop il montaggio automatico avviene solo quando i device dei supporti removibili non sono elencati in "/etc/fstab".

Il punto di mount negli ambienti desktop moderni viene scelto come "/media/<etichetta_disco>" che può essere personalizzata nel modo seguente.

  • mlabel(1) per file system FAT

  • genisoimage(1) con l'opzione "-V" per file system ISO9660

  • tune2fs(1) con l'opzione "-L" per file system ext2/ext3/ext4

[Suggerimento] Suggerimento

Può essere necessario fornire come opzione di montaggio la scelta della codifica (vedere Sezione 8.3.6, «Codifica per i nomi di file»).

[Suggerimento] Suggerimento

L'uso del menu GUI per smontare un file system può rimuovere il suo nodo di device generato dinamicamente come "/dev/sdc". Se si desidera mantenere il suo nodo di device, smontarlo con il comando umount(8) dal prompt di shell.

Quando si condividono dati con un altro sistema attraverso dispositivi di archiviazione removibili, quest'ultimi andrebbero formattati con un filesystem comune supportato da entrambi i sistemi. Quello che segue è un elenco delle scelte possibili per il file system.


[Suggerimento] Suggerimento

Vedere Sezione 9.8.1, «Cifratura di dischi removibili con dm-crypt/LUKS» per la condivisione interpiattaforma di dati usando cifratura a livello di dispositivo.

Il file system FAT è supportato da quasi tutti i sistemi operativi moderni ed è piuttosto utile per scopi di scambio di dati attraverso supporti come dischi fissi removibili.

Quando si formatta un dispositivo come un disco fisso removibile con il file system FAT per la condivisione interpiattaforma di dati, le scelte seguenti dovrebbero essere quelle più sicure.

Quando si usano i file system FAT o ISO9660 per la condivisione dei dati, per essere sicuri dei risultati, si dovrebbero considerare i seguenti aspetti.

  • Archiviare prima i file in un file di archivio usando tar(1) o cpio(1) per mantenere i nomi di file lunghi, i collegamenti simbolici, i permessi Unix sui file originali e le informazioni sui proprietari.

  • Suddividere il file di archivio in pezzi più piccoli di 2 GiB con il comando split(1) per proteggerli da limitazioni sulla dimensione dei file.

  • Cifrare il file archivio per proteggere i suoi contenuti da accesso non autorizzato.

[Nota] Nota

Il file system FAT, per sua stessa natura, permette una dimensione massima per i file di (2^32 - 1) byte = (4GiB - 1 byte). Per alcune applicazioni su sistemi operativi a 32 bit più vecchi, la dimensione massima per i file era ancora più piccola: (2^31 - 1) byte = (2GiB - 1 byte). Debian non soffre di quest'ultima limitazione.

[Nota] Nota

La stessa Microsoft non raccomanda l'uso di FAT per le unità o le partizioni più grandi di 200 MB. Microsoft evidenzia le sue limitazioni, quali un uso inefficiente dello spazio su disco, nel documento "Overview of FAT, HPFS, and NTFS File Systems". Naturalmente per Linux si dovrebbe normalmente usare il file system ext4.

[Suggerimento] Suggerimento

Per maggiori informazioni sui file system e sull'accesso ad essi, leggere il "Filesystems HOWTO".

Tutti sanno che i computer a volte si danneggiano oppure errori umani causano danni al sistema e ai dati. Le operazioni di backup e ripristino sono una parte essenziale di un'amministrazione di sistema di successo. Tutte i possibili modi in cui si possono creare danni si verificano prima o poi.

[Suggerimento] Suggerimento

Mantenere il proprio sistema di backup semplice e fare il backup di sistema spesso. Avere dati di backup è più importante della qualità tecnica del metodo di backup.

Ci sono 3 fattori chiave che determinano la reale politica di backup e ripristino.

  1. Sapere di cosa fare il backup ed il ripristino

    • I file dati direttamente creati dall'utente: in "~/"

    • I file dati creati da applicazioni usate dall'utente: dati in "/var/" (tranne "/var/cache/", "/var/run/" e "/var/tmp/")

    • File di configurazione del sistema: dati in "/etc/"

    • Software locali: dati in "/usr/local/" o "/opt/"

    • Informazioni di installazione del sistema: un memorandum in puro testo sui passi chiave (partizioni, …)

    • Insiemi di dati comprovati: confermati da operazioni preventive sperimentali di ripristino

  2. Sapere come fare il backup ed il ripristino

    • Rendere sicura l'archiviazione dei dati: protezione da sovrascritture e fallimenti del sistema

    • Backup frequenti: backup pianificati

    • Backup ridondanti: mirror di dati

    • Procedura a prova di idioti: singolo facile comando di backup

  3. Valutazione dei rischi e dei costi

    • Valore dei dati se persi

    • Risorse necessarie per il backup: umane, hardware, software, …

    • Modi in cui le cose possono andare storte e loro probabilità

[Nota] Nota

Non fare il backup dei contenuti dei pseudo file system che si trovano in /proc, /sys, /tmp e /run (vedere Sezione 1.2.12, «procfs e sysfs» e Sezione 1.2.13, «tmpfs»). A meno di non sapere esattamente ciò che si sta facendo, sono un'enorme mole di dati senza utilità.

Per quanto riguarda il rendere sicura l'archiviazione dei dati, questi dovrebbero essere come minimo in una partizione diversa del disco e preferibilmente su dischi e macchine diversi per sopravvivere alla corruzione del file system. È preferibile archiviare i dati importanti su supporti scrivibili una sola volta, come CD/DVD-R per prevenire incidenti di sovrascrittura. (Vedere Sezione 9.7, «I dati binari» per come scrivere sul supporto di archiviazione dalla riga di comando. L'ambiente desktop GNOME con interfaccia grafica fornisce un facile accesso tramite menu: "Risorse→Creazione CD/DVD".)

[Nota] Nota

Durante il backup dei dati può essere preferibile fermare alcuni demoni applicativi come l'MTA (vedere Sezione 6.3, «Agente di trasporto della posta (MTA)»).

[Nota] Nota

Si dovrebbe dare un'attenzione particolare al backup ed al ripristino di file con dati relativi all'identità dell'utente, come "/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" e "/etc/exim4/passwd.client". Alcuni di questi dati non possono essere ricreati inserendo la stessa stringa di input nel sistema.

[Nota] Nota

Se si esegue un compito di cron come processo di un utente, si deve ripristinare i file nella directory "/var/spool/cron/crontabs" e riavviare cron(8). Vedere Sezione 9.3.14, «Pianificare compiti in modo regolare» per informazioni su cron(8) e crontab(1).

Quello che segue è un elenco di importanti suite di utilità di backup disponibili in un sistema Debian


Gli strumenti di backup hanno una propria specializzazione.

  • Mondo Rescue è un sistema di backup per facilitare il ripristino veloce di un sistema completo a partire da backup su CD/DVD ecc., senza dover affrontare il normale processo di installazione del sistema.

  • I pacchetti sbackup e keep forniscono agli utenti desktop un semplice frontend con interfaccia grafica per fare backup regolari dei loro dati. Una funzione equivalente può essere svolta da un semplice script (Sezione 10.2.2, «Uno script di esempio per il backup di sistema») e cron(8).

  • Bacula, Amanda e BackupPC sono suite di utilità di backup complete che sono pensate per backup regolari in rete.

Gli strumenti base descritti in Sezione 10.1.1, «Strumenti di archiviazione e compressione» e Sezione 10.1.2, «Strumenti di copia e sincronizzazione» possono essere usati per facilitare il backup di sistema attraverso script personalizzati. Tali script possono essere migliorati con gli strumenti seguenti.

  • Il pacchetto obnam permette backup incrementali (remoti).

  • Il pacchetto rdiff-backup permette backup incrementali (remoti).

  • Il pacchetto dump aiuta ad archiviare e ripristinare tutto il file system in maniera incrementale ed efficiente.

[Suggerimento] Suggerimento

Per imparare ulteriori informazioni sul pacchetto dump, vedere i file in "/usr/share/doc/dump/" e "Is dump really deprecated? (dump è davvero deprecato?).

Per un sistema desktop Debian personale con la suite unstable, devo proteggere solo i dati personali e quelli critici; tanto reinstallo comunque il sistema una volta all'anno. Perciò non ho ragione di fare il backup dell'intero sistema o di installare un'utilità completa di backup.

Uso un semplice script per fare un archivio di backup e masterizzarlo su CD/DVD usando una GUI. Ecco uno script di esempio che fa proprio questo.

#!/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

Questo è pensato come esempio di script che deve essere eseguito da root.

Modificarlo ed eseguirlo nel modo seguente.

Mantenere le cose semplici!

[Suggerimento] Suggerimento

Si possono ripristinare i dati di configurazione di debconf con "debconf-set-selections debconf-selections" ed i dati delle selezioni di dpkg con "dpkg --set-selection <dpkg-selections.list".

Per l'insieme dei dati in un albero di directory, la copia con "cp -a" fornisce normali backup.

Per un grande insieme di dati statici non sovrascritti in un albero di directory, come quello nella directory "/var/cache/apt/packages/", i collegamenti fisici creati con "cp -al" forniscono un'alternativa ai normali backup con un uso efficiente dello spazio su disco.

Ecco uno script di copia, che ho chiamato bkup, per il backup di dati. Questo script copia tutti i file (non-VCS) contenuti nella directory attuale in una directory datata nella directory genitore o in un host 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

Questo script è pensato per essere un esempio per i comandi; leggerlo e modificarlo prima di usarlo.

[Suggerimento] Suggerimento

Io tengo questo script bkup nella mia directory "/usr/local/bin/" ed eseguo il comando bkup senza opzioni nella directory di lavoro ogni volta che ho bisogno di un backup istantaneo temporaneo.

[Suggerimento] Suggerimento

Per creare uno storico delle istantanee di un albero di file sorgenti o di un albero di file di configurazione, l'uso di git(7) è più semplice e più efficiente in termini di spazio (vedere Sezione 10.6.5, «Git per registrare la cronologia della configurazione»).

L'infrastruttura di sicurezza dei dati viene fornita dalla combinazione di strumenti di cifratura dei dati, strumenti message digest e strumenti di firma.


Per dm-crypto e ecryptfs che implementano infrastrutture di cifratura automatica dei dati attraverso moduli del kernel Linux, vedere Sezione 9.8, «Suggerimenti per la cifratura dei dati».

Quelli che seguono sono alcuni comandi per GNU Privacy Guard per la gestione base delle chiavi.


Quelli seguenti sono i significati dei codici di fiducia.


Il comando seguente carica la mia chiave "1DD8D791" sul popolare server di chiavi "hkp://keys.gnupg.net".

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

Un buon server di chiavi predefinito impostato in "~/.gnupg/gpg.conf" (o nella vecchia posizione "~/.gnupg/options") si ottiene la voce seguente.

keyserver hkp://keys.gnupg.net

Il comando seguente recupera le chiavi sconosciute dal server di chiavi.

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

In OpenPGP Public Key Server (versioni pre-0.9.6) esisteva un bug che corrompeva le chiavi con più di 2 sottochiavi. I pacchetti GnuPG più recenti (>1.2.1-2) possono gestire queste sottochiavi corrotte. Vedere l'opzione "--repair-pks-subkey-bug in gpg(1).

md5sum(1) fornisce un'utilità per creare un file digest usando il metodo descritto nella rfc1321 e per verificare i file con esso.

$ md5sum pippo pluto >paperino.md5
$ cat paperino.md5
d3b07384d113edec49eaa6238ad5ff00  pippo
c157a79031e1c40f85931829bc5fc552  pluto
$ md5sum -c paperino.md5
pippo: OK
pluto: OK
[Nota] Nota

Il calcolo delle somme di controllo MD5 è meno dispendioso in termini di CPU di quello delle firme crittografiche di GNU Privacy Guard (GnuPG). Di solito solamente il file digest di più alto livello è firmato crittograficamente per assicurare l'integrità dei dati.

Esistono molti strumenti per la fusione di codice sorgente. Quello che segue è un elenco di strumenti che hanno catturato la mia attenzione.

Tabella 10.10. Elenco di strumenti per la fusione di codice sorgente

pacchetto popcon dimensione comando descrizione
diffutils V:856, I:978 1327 diff(1) confronta i file riga per riga
diffutils V:856, I:978 1327 diff3(1) confronta e fonde tre file riga per riga
vim V:118, I:393 2374 vimdiff(1) confronta 2 file uno di fianco all'altro in vim
patch V:100, I:928 216 patch(1) applica un file diff ad un originale
dpatch V:1, I:17 191 dpatch(1) gestisce serie di patch per pacchetti Debian
diffstat V:20, I:188 70 diffstat(1) produce un istogramma delle modifiche apportate da un diff
patchutils V:19, I:180 223 combinediff(1) crea una patch cumulativa da due patch incrementali
patchutils V:19, I:180 223 dehtmldiff(1) estrae un diff da una pagina HTML
patchutils V:19, I:180 223 filterdiff(1) estrae o esclude diff da un file diff
patchutils V:19, I:180 223 fixcvsdiff(1) aggiusta file diff creati da CVS che sono male interpretati da patch(1)
patchutils V:19, I:180 223 flipdiff(1) scambia l'ordine di due patch
patchutils V:19, I:180 223 grepdiff(1) mostra quali file siano modificati da una patch che fa corrispondenza con un'espressione regolare
patchutils V:19, I:180 223 interdiff(1) mostra le differenze tra due file diff unificati
patchutils V:19, I:180 223 lsdiff(1) mostra quali file vengano modificati da una patch
patchutils V:19, I:180 223 recountdiff(1) ricalcola conteggi e offset in diff unificati
patchutils V:19, I:180 223 rediff(1) aggiusta conteggi ed offset di un diff modificato a mano
patchutils V:19, I:180 223 splitdiff(1) separa due patch incrementali
patchutils V:19, I:180 223 unwrapdiff(1) ripristina patch il cui contenuto è stato mandato a capo automaticamente
wiggle V:0, I:0 166 wiggle(1) applica le patch respinte
quilt V:4, I:44 711 quilt(1) gestisce serie di patch
meld V:13, I:42 3049 meld(1) confronta e fonde file (GTK)
dirdiff V:0, I:3 144 dirdiff(1) mostra le differenze ed apporta i cambiamenti tra alberi di directory
docdiff V:0, I:0 573 docdiff(1) confronta due file parola per parola / carattere per carattere
imediff2 V:0, I:0 34 imediff2(1) strumento interattivo a tutto schermo di applicazione di modifiche bidirezionale
makepatch V:0, I:0 102 makepatch(1) genera file patch estesi
makepatch V:0, I:0 102 applypatch(1) applica file patch estesi
wdiff V:5, I:85 643 wdiff(1) mostra le differenze di parole tra file di testo

Ecco un riassunto dei sistemi di controllo delle versioni (VCS) nel sistema Debian.

[Nota] Nota

Se non si ha esperienza di sistemi VCS, si dovrebbe iniziare ad imparare con Git che sta acquistando sempre più popolarità.


Un VCS viene a volte chiamato sistema di controllo delle revisioni (RCS) o gestione della configurazione software (SCM).

Al giorno d'oggi i VCS distribuiti come Git sono gli strumenti preferiti. CVS e Subversion possono essere ancora utili per aggregarsi ad alcune realtà di programmi open source esistenti.

Debian fornisce servizi VCS liberi attraverso il servizio Debian Alioth che supporta praticamente tutti i VCS. La sua documentazione è reperibile su http://wiki.debian.org/Alioth.

Ci sono alcune nozioni base da ricordare per creare un accesso condiviso ad un archivio VCS.

Quella che segue è una comparazione ipersemplificata, per dare un'idea generale dei comandi VCS nativi. La sequenza di comandi usata tipicamente può richiedere opzioni ed argomenti.


[Attenzione] Attenzione

A partire dall'inizio del 2006, l'invocazione diretta, dalla riga di comando, di un sottocomando di git come "git-xyz" è diventata deprecata.

[Suggerimento] Suggerimento

Se c'è un file eseguibile git-pippo nel percorso specificato da $PATH, l'inserimento nella riga di comando di "git pippo" senza trattino invoca tale git-pippo. Questa è una funzionalità del comando git.

[Suggerimento] Suggerimento

Gli strumenti con interfaccia utente grafica, come tkcvs(1) e gitk(1), aiutano realmente a tenere traccia della cronologia delle revisioni dei file. L'interfaccia web fornita da molti archivi pubblici per la navigazione dei loro repository è anch'essa piuttosto utile.

[Suggerimento] Suggerimento

Git può lavorare direttamente con diversi archivi VCS, come quelli forniti da CVS e Subversion, e fornisce archivi locali per modifiche locali tramite i pacchetti git-cvs e git-svn. Vedere Git per utenti CVS e la Sezione 10.6.4, «Git per repository Subversion».

[Suggerimento] Suggerimento

Git ha comandi che non hanno equivalenti in CVS e Subversion: "fetch", "rebase", "cherry-pick", …

Git può fare tutto ciò che riguarda la gestione di codice sorgente, sia in locale sia in remoto. Ciò significa che è possibile registrare i cambiamenti al codice sorgente senza bisogno di connessione di rete all'archivio remoto.

Vedere la documentazione seguente.

I comandi git-gui(1) e gitk(1) rendono l'uso di Git molto semplice.

[Avvertimento] Avvertimento

Non usare stringhe per etichette contenenti spazi, anche se alcuni strumenti come gitk(1) lo permettono. Altri comandi git potrebbero avere problemi con esse.

Anche se l'archivio a monte usa un diverso VCS, potrebbe essere una buona idea usare git(1) per l'attività locale, dato che si può gestire la propria copia locale dell'albero dei sorgenti senza una connessione di rete con l'archivio a monte. Ecco alcuni pacchetti e comandi usati con git(1).


[Suggerimento] Suggerimento

Con git(1) si lavora su un ramo locale con molti commit e si usa successivamente un comando simile a "git rebase -i master" per riorganizzare la cronologia dei cambiamenti. Ciò permette di avere cronologie dei cambiamenti pulite. Vedere git-rebase(1) e git-cherry-pick(1).

[Suggerimento] Suggerimento

Quando si vuole tornare ad una directory di lavoro pulita senza perdere lo stato attuale della directory di lavoro, si può usare "git stash". Vedere git-stash(1).

Si può registrare manualmente la cronologia della configurazione usando strumenti Git. Quello che segue è un semplice esempio che insegna a registrare il contenuto di "/etc/apt/".

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

Fare il commit della configurazione con una descrizione.

Modificare i file di configurazione

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

Fare il commit della configurazione con una descrizione e andare avanti con la propria vita.

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

Si avrà una completa cronologia della configurazione.

[Nota] Nota

Per lavorare con tutti i tipi di permessi dei dati di configurazione è necessario sudo(8). Per i dati di configurazione dell'utente, si può saltare l'uso di sudo.

[Nota] Nota

Il comando "chmod 700 .git" nell'esempio precedente è necessario per proteggere i dati dell'archivio da accessi non autorizzati.

[Suggerimento] Suggerimento

Per l'impostazione di un sistema di registrazione della configurazione più completo, guardare il pacchetto etckeeper: Sezione 9.2.10, «Registrare i cambiamenti a file di configurazione».

Vedere la documentazione seguente.

  • cvs(1)

  • "/usr/share/doc/cvs/html-cvsclient"

  • "/usr/share/doc/cvs/html-info"

  • "/usr/share/doc/cvsbook"

  • "info cvs"

Molti server CVS pubblici forniscono accesso remoto solo in lettura all'account "anonymous" tramite il servizio pserver. I contenuti del sito Debian, per esempio, sono mantenuti dal progetto webwml attraverso CVS sul servizio Debian Alioth. Il comando seguente imposta "$CVSROOT" per l'accesso remoto al suo archivio CVS.

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

Dato che pserver è esposto ad attacchi di spionaggio ed è insicuro, l'accesso in scrittura è solitamente disabilitato dagli amministratori del server.

Il comando seguente imposta "$CVS_RSH" e "$CVSROOT" per l'accesso remoto con SSH all'archivio CVS del progetto webwml.

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

Si può anche usare l'autenticazione con chiave pubblica per SSH che elimina la richiesta di inserimento della password remota.

Ecco un esempio di una sequenza tipica di azioni svolte nell'uso di CVS.

Controllare tutti i moduli disponibili dal progetto CVS a cui punta "$CVSROOT" con il comando seguente.

$ cvs rls
CVSROOT
modulo1
modulo2
...

Fare il checkout di "modulo1" nella sua directory predefinita "./modulo1" con il comando seguente.

$ cd ~/percorso/di
$ cvs co modulo1
$ cd modulo1

Fare i cambiamenti desiderati necessari ai contenuti.

Controllare i cambiamenti facendo l'equivalente di "diff -u [archivio] [locale]" con il comando seguente.

$ cvs diff -u

Si scopre, ad esempio, di aver corrotto gravemente un file "file_da_ripristinare", ma gli altri file sono a posto.

Sovrascrivere "file_da_ripristinare" con una copia pulita dal CVS con il comando seguente.

$ cvs up -C file_da_ripristinare

Salvare l'albero dei sorgenti locale aggiornato sul CVS con il comando seguente.

$ cvs ci -m "Descrivere qui i cambiamenti"

Creare ed aggiungere il file "file_da_aggiungere" al CVS con il comando seguente.

$ vi file_da_aggiungere
$ cvs add file_da_aggiungere
$ cvs ci -m "Aggiunto file_da_aggiungere"

Fondere la versione più recente dal CVS con il comando seguente.

$ cvs up -d

Prestare attenzione alle righe che iniziano con "C nomefile" che indicano le modifiche che creano conflitti.

Cercare il codice non modificato in ".#nomefile.versione".

Per trovare le modifiche che creano conflitti cercare "<<<<<<<" e ">>>>>>>" nei file.

Modificare i file in modo da risolvere i conflitti.

Aggiungere un'etichetta di rilascio "Rilascio-1" nel modo seguente.

$ cvs ci -m "ultimo commit per Rilascio-1"
$ cvs tag Rilascio-1

Modificare ulteriormente.

Rimuovere l'etichetta di rilascio "Rilascio-1" con il comando seguente.

$ cvs tag -d Rilascio-1

Fare il commit delle modifiche sul CVS con il comando seguente.

$ cvs ci -m "ultimissimo commit per Rilascio-1"

Riaggiungere l'etichetta di rilascio "Rilascio-1" all'HEAD CVS aggiornato principale con il comando seguente.

$ cvs tag Rilascio-1

Creare un ramo con un'etichetta permanente "Rilascio-iniziale-risoluzionebug" dalla versione originale a cui punta l'etichetta "Rilascio-iniziale" e farne il checkout nella directory "~/percorso/di/vecchio" nel modo seguente.

$ cvs rtag -b -r Rilascio-iniziale Rilascio-iniziale-risoluzionebug modulo1
$ cd ~/percorso/di
$ cvs co -r Rilascio-iniziale-risoluzionebug -d vecchio modulo1
$ cd vecchio
[Suggerimento] Suggerimento

Per specificare una particolare data come punto di ramificazione, usare "-D 2005-12-20" (formato ISO 8601 per le date) invece di "-r Rilascio-iniziale".

Lavorare in questo albero locale di sorgenti che ha l'etichetta permanente "Rilascio-iniziale-risoluzionebug" e che è basato sulla versione originale.

Lavorare in questo ramo da soli … fino a che qualcun altro non si aggiunge al ramo "Rilascio-iniziale-risoluzionebug".

Fare la sincronizzazione dei file modificati da altri in questo ramo, creando contemporaneamente nuove directory se necessario, con il comando seguente.

$ cvs up -d

Modificare i file in modo da risolvere i conflitti.

Fare il commit delle modifiche sul CVS con il comando seguente.

$ cvs ci -m "fatto il commit in questo ramo"

Aggiornare l'albero locale con l'HEAD del principale, rimuovendo allo stesso tempo l'etichetta permanente ("-A") e senza espansione delle parole chiave ("-kk"), con il comando seguente.

$ cvs up -d -kk -A

Aggiornare l'albero locale (contenuto = HEAD del principale) fondendo dal ramo "Rilascio-iniziale-risoluzionebug" e senza espansione delle parole chiave con il comando seguente.

$ cvs up -d -kk -j Rilascio-iniziale-risoluzionebug

Correggere i conflitti con l'editor.

Fare il commit delle modifiche sul CVS con il comando seguente.

$ cvs ci -m "fusione con Rilascio-iniziale-risoluzionebug"

Creare un file archivio nel modo seguente.

$ cd ..
$ mv vecchio vecchio-modulo1-risoluzionebug
$ tar -cvzf vecchio-modulo1-risoluzionebug.tar.gz vecchio-modulo1-risoluzionebug
$ rm -rf vecchio-modulo1-risoluzionebug
[Suggerimento] Suggerimento

Il comando "cvs up" accetta l'opzione "-d" per creare nuove directory e l'opzione "-P" per eliminare le directory vuote.

[Suggerimento] Suggerimento

Si può fare il checkout solamente di una sottodirectory di "modulo1" fornendo il suo nome come in "cvs co modulo1/sottodir".


Subversion è un sistema di controllo delle versioni di recente generazione che rimpiazza il più vecchio CVS. Ha la maggior parte delle funzionalità di CVS, tranne le etichette ed i rami.

Per impostare un server Subversion è necessario installare i pacchetti subversion, libapache2-svn e subversion-tools.

Ecco un esempio di una sequenza tipica di azioni svolte nell'uso di Subversion con il suo client nativo.

[Suggerimento] Suggerimento

I comandi client forniti dal pacchetto git-svn possono offrire un metodo alternativo di lavoro con Subversion con l'uso del comando git. Vedere Sezione 10.6.4, «Git per repository Subversion».

Controllare tutti i moduli disponibili dal progetto Subversion a cui punta l'URL "file:///srv/svn/progetto" con il comando seguente.

$ svn list file:///srv/svn/progetto
modulo1
modulo2
...

Fare il checkout di "modulo1/trunk" in una directory "./modulo1" con il comando seguente.

$ cd ~/percorso/di
$ svn co file:///srv/svn/progetto/modulo1/trunk modulo1
$ cd modulo1

Fare i cambiamenti desiderati necessari ai contenuti.

Controllare i cambiamenti facendo l'equivalente di "diff -u [archivio] [locale]" con il comando seguente.

$ svn diff

Si scopre, ad esempio, di aver corrotto gravemente un file "file_da_ripristinare", ma gli altri file sono a posto.

Sovrascrivere "file_da_ripristinare" con una copia pulita da Subversion con il comando seguente.

$ svn revert file_da_ripristinare

Salvare l'albero dei sorgenti locale aggiornato su Subversion con il comando seguente.

$ svn ci -m "Descrivere qui i cambiamenti"

Creare ed aggiungere il file "file_da_aggiungere" a Subversion con il comando seguente.

$ vi file_da_aggiungere
$ svn add file_da_aggiungere
$ svn ci -m "Aggiunto file_da_aggiungere"

Fondere la versione più recente da Subversion con il comando seguente.

$ svn up

Prestare attenzione alle righe che iniziano con "C nomefile" che indicano le modifiche che creano conflitti.

Cercare codice non modificato in, ad esempio "nomefile.r6", "nomefile.r9" e "nomefile.mio".

Per trovare le modifiche che creano conflitti cercare "<<<<<<<" e ">>>>>>>" nei file.

Modificare i file in modo da risolvere i conflitti.

Aggiungere un'etichetta di rilascio "Rilascio-1" nel modo seguente.

$ svn ci -m "ultimo commit per Rilascio-1"
$ svn cp file:///srv/svn/progetto/modulo1/trunk file:///srv/svn/progetto/modulo1/tags/Rilascio-1

Modificare ulteriormente.

Rimuovere l'etichetta di rilascio "Rilascio-1" con il comando seguente.

$ svn rm file:///srv/svn/progetto/modulo1/tags/Rilascio-1

Fare il commit delle modifiche su Subversion con il comando seguente.

$ svn ci -m "ultimissimo commit per Rilascio-1"

Riaggiungere l'etichetta di rilascio "Rilascio-1" all'HEAD CVS aggiornato di trunk con il comando seguente.

$ svn cp file:///srv/svn/progetto/modulo1/trunk file:///srv/svn/progetto/modulo1/tags/Rilascio-1

Creare un ramo con percorso "modulo1/branches/Rilascio-iniziale-risoluzionebug" dalla versione originale a cui punta il percorso "modulo1/tags/Rilascio-iniziale" e farne il checkout nella directory "~/percorso/di/vecchio" nel modo seguente.

$ svn cp file:///srv/svn/progetto/modulo1/tags/Rilascio-initzale file:///srv/svn/progetto/modulo1/branches/Rilascio-iniziale-risoluzionebug
$ cd ~/percorso/di
$ svn co file:///srv/svn/progetto/modulo1/branches/Rilascio-iniziale-risoluzionebug vecchio
$ cd vecchio
[Suggerimento] Suggerimento

Per specificare una particolare data come punto di ramificazione, usare "modulo1/trunk@{2005-12-20}" (formato ISO 8601 per le date) invece di "modulo1/tags/Rilascio-iniziale".

Lavorare in questo albero locale di sorgenti che punta al ramo "Rilascio-iniziale-risoluzionebug" e che è basato sulla versione originale.

Lavorare in questo ramo da soli … fino a che qualcun altro non si aggiunge al ramo "Rilascio-iniziale-risoluzionebug".

Fare la sincronizzazione con i file in questo ramo modificati da altri, con il comando seguente.

$ svn up

Modificare i file in modo da risolvere i conflitti.

Fare il commit delle modifiche su Subversion con il comando seguente.

$ svn ci -m "fatto il commit in questo ramo"

Aggiornare l'albero locae con HEAD di trunk nel modo seguente.

$ svn switch file:///srv/svn/progetto/modulo1/trunk

Aggiornare l'albero locale (contenuto = HEAD di trunk) fondendo dal ramo "Rilascio-iniziale-risoluzionebug" con il comando seguente.

$ svn merge file:///srv/svn/progetto/modulo1/branches/Rilascio-iniziale-risoluzionebug

Correggere i conflitti con l'editor.

Fare il commit delle modifiche su Subversion con il comando seguente.

$ svn ci -m "fusione con Rilascio-iniziale-risoluzionebug"

Creare un file archivio nel modo seguente.

$ cd ..
$ mv vecchio vecchio-modulo1-risoluzionebug
$ tar -cvzf vecchio-modulo1-risoluzionebug.tar.gz vecchio-modulo1-risoluzionebug
$ rm -rf vecchio-modulo1-risoluzionebug
[Suggerimento] Suggerimento

Si possono sostituire gli URL come "file:///…" con URL in qualsiasi altro formato, come "http://…" e "svn+ssh://…".

[Suggerimento] Suggerimento

Si può fare il checkout solamente di una sottodirectory di "modulo1" fornendo il suo nome come in "svn co file:///srv/svn/progetto/modulo1/trunk/sottodir modulo1/sottodir", ecc.