Indice
In questo capitolo sono descritti strumenti e trucchi per gestire dati binari e di testo in un sistema Debian.
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:916, I:999 | 2880 |
.tar
|
tar(1) | strumento di archiviazione standard (standard de facto) |
cpio
|
V:464, I:999 | 989 |
.cpio
|
cpio(1) | strumento di archiviazione Unix in stile System V, da usare con find(1) |
binutils
|
V:186, I:694 | 93 |
.ar
|
ar(1) | strumento di archiviazione per la creazione di librerie statiche |
fastjar
|
V:4, I:45 | 172 |
.jar
|
fastjar(1) | strumento di archiviazione per Java (simile a zip) |
pax
|
V:14, I:36 | 164 |
.pax
|
pax(1) |
nuovo strumento POSIX di archiviazione, compromesso tra
tar e cpio
|
gzip
|
V:888, I:999 | 243 |
.gz
|
gzip(1), zcat(1), … | utilità GNU di compressione LZ77 (standard de facto) |
bzip2
|
V:178, I:953 | 196 |
.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:3, I:39 | 141 |
.lzma
|
lzma(1) | utilità di compressione LZMA con maggiore rapporto di compressione di gzip(1) (deprecata) |
xz-utils
|
V:434, I:964 | 442 |
.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:88, I:439 | 986 |
.7z
|
7zr(1), p7zip(1) | strumento di archiviazione file 7-Zip con alto rapporto di compressione (compressione LZMA) |
p7zip-full
|
V:131, I:521 | 4659 |
.7z
|
7z(1), 7za(1) | strumento di archiviazione file 7-Zip con alto rapporto di compressione (compressione LZMA e altre) |
lzop
|
V:6, I:51 | 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:50, I:442 | 608 |
.zip
|
zip(1) | InfoZIP: strumento di archiviazione e compressione per DOS |
unzip
|
V:250, I:804 | 554 |
.zip
|
unzip(1) | InfoZIP: strumento di estrazione di archivi e decompressione per DOS |
Avvertimento | |
---|---|
Non impostare la variabile " |
Nota | |
---|---|
Gli archivi
tar(1)
compressi con gzip usano l'estensione di file " |
Nota | |
---|---|
Gli archivi
tar(1)
compressi con xz usano l'estensione di file " |
Nota | |
---|---|
La popolarità dei metodi di compressione negli strumenti FOSS come
tar(1)
è cambiata nel tempo nel modo seguente |
Nota | |
---|---|
cp(1), scp(1) e tar(1) possono avere alcune limitazioni per file speciali. cpio(1) è più versatile. |
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 | |
---|---|
La struttura interna dei file di dati di LibreOffice è quella dei file
« |
Nota | |
---|---|
Lo strumento multipiattaforma di fatto usato per gli archivi è
|
Ecco una tabella riassuntiva dei semplici strumenti di copia e backup disponibili in un sistema Debian.
Tabella 10.2. Elenco di strumenti di copia e sincronizzazione
pacchetto | popcon | dimensione | strumento | funzione |
---|---|---|---|---|
coreutils
|
V:888, I:999 | 15719 | GNU cp | copia file e directory localmente ("-a" per modalità ricorsiva) |
openssh-client
|
V:811, I:994 | 3545 | scp |
copia file e directory da remoto (client, "-r " per
modalità ricorsiva)
|
openssh-server
|
V:686, I:813 | 1449 | sshd | copia file e directory da remoto (server remoto) |
rsync
|
V:365, I:628 | 729 | - | sincronizzazione e backup in remoto unidirezionale |
unison
|
V:3, I:18 | 3457 | - | sincronizzazione e backup in remoto bidirezionale |
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 | |
---|---|
L'esecuzione, tramite
cron(8),
dello script |
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 archiviare ed estrarre archivi con l'intero contenuto
della directory "./sorgente
", usando diversi strumenti.
GNU tar(1):
$ tar -cvJf archivo.tar.xz ./sorgente $ tar -xvJf archivo.tar.xz
In alternativa usare i comandi seguenti.
$ find ./sorgente -xdev -print0 | tar -cvJf archivo.tar.xz --null -F -
cpio(1):
$ find ./sorgente -xdev -print0 | cpio -ov --null > archivo.cpio; xz archivo.cpio $ zcat archivo.cpio.xz | cpio -i
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 | |
---|---|
rsync(8)
e GNU
cp(1)
hanno l'opzione " |
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.
Cercare tutti i file a partire da "/percorso/di
"
Limitare globalmente la ricerca al file system da cui è richiamato e usare espressioni regolari ERE (vedere Sezione 1.6.2, «Espressioni regolari»)
Escludere i file che corrispondono all'espressione regolare
".*\.cpio
" o ".*~
" dalla ricerca
fermando la loro elaborazione
Escludere le directory che corrispondono all'espressione regolare
".*/\.git
" dalla ricerca fermando la loro elaborazione
Escludere i file più grandi di 99 Megabyte (unità di 1048576 byte) dalla ricerca fermando la loro elaborazione
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 | |
---|---|
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
" |
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 | |
---|---|
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 | |
---|---|
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 | |
---|---|
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 | |
---|---|
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.
Fotocamera digitale
Lettore audio digitale
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
".
Suggerimento | |
---|---|
I dispositivi montati automaticamente hanno l'opzione di mount
" |
Suggerimento | |
---|---|
Nei moderni ambienti desktop il montaggio automatico avviene solo quando i
device dei supporti removibili non sono elencati in
" |
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 | |
---|---|
Può essere necessario fornire come opzione di montaggio la scelta della codifica (vedere Sezione 8.4.6, «Codifica per i nomi di file»). |
Suggerimento | |
---|---|
L'uso del menu GUI per smontare un file system può rimuovere il suo nodo di
device generato dinamicamente come " |
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.
Tabella 10.3. Elenco di possibili scelte per il file system di dispositivi di archiviazione removibili con scenari di uso tipici
file system | descrizione dello scenario di uso tipico |
---|---|
FAT12 | condivisione interpiattaforma di dati su dischetti floppy (<32MiB) |
FAT16 | condivisione interpiattaforma di dati su dispositivi come piccoli dischi fissi (<2GiB) |
FAT32 | condivisione interpiattaforma di dati su dispositivi come grandi dischi fissi (<8TiB, supportato da sistemi più recenti di MS Windows95 OSR2) |
NTFS | condivisione interpiattaforma di dati su dispositivi come grandi dischi fissi (supportato nativamente su MS Windows NT e versioni successive e supportato da NTFS-3G attraverso FUSE in Linux) |
ISO9660 | condivisione interpiattaforma di dati statici su CD-R e DVD+/-R |
UDF | scrittura incrementale di dati su CD-R e DVD+/-R (nuovo) |
file system MINIX | archiviazione, efficiente in termini di spazio, di file dati unix su dischetti floppy |
file system ext2 | condivisione di dati su dispositivi come dischi fissi con sistemi Linux più vecchi |
file system ext3 | condivisione di dati su dispositivi come dischi fissi con sistemi Linux più vecchi |
file system ext4 | condivisione di dati su dispositivi come dischi fissi con sistemi Linux recenti |
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.
Partizionare con fdisk(8), cfdisk(8) o parted(8) (vedere Sezione 9.5.2, «Configurazione del partizionamento dei dischi») creando un'unica partizione primaria e marcarla nel modo seguente.
Tipo "6", cioè FAT16, per supporti più piccoli di 2GB.
Tipo "c", cioè FAT32 (LBA), per supporti più grandi.
Formattare la partizione primaria con mkfs.vfat(8) nel modo seguente.
Per FAT16, semplicemente con il suo nome di device, ad esempio
"/dev/sda1
".
Per FAT32, con il suo nome di device e l'opzione esplicita, ad esempio
"-F 32 /dev/sda1
"
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 | |
---|---|
Il file system FAT, per sua stessa natura, permette una dimensione massima
per i file di |
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 | |
---|---|
Per maggiori informazioni sui file system e sull'accesso ad essi, leggere il "Filesystems HOWTO". |
Quando si condividono dati con un altro sistema attraverso una rete, si dovrebbero tenere a mente i servizi comuni. Ecco alcuni suggerimenti.
Tabella 10.4. Elenco dei servizi di rete da scegliere in base allo scenario di uso tipico
servizio di rete | descrizione dello scenario di uso tipico |
---|---|
file system montato di rete SMB/CIFS con Samba |
condivisione di file attraverso "rete Microsoft Windows", vedere
smb.conf(5)
e The Official Samba 3.x.x
HOWTO and Reference Guide o il pacchetto
samba-doc
|
file system montato di rete NFS con il kernel Linux | condivisione di file attraverso "rete Unix/Linux", vedere exports(5) e Linux NFS-HOWTO |
servizio HTTP | condivisione di file tra client/server web |
servizio HTTPS | condivisione di file tra client/server web con SSL (Secure Sockets Layer) cifrato o TLS (Transport Layer Security) |
servizio FTP | condivisione di file tra client/server FTP |
Sebbene questi file system montati in rete e metodi di trasferimento di file attraverso la rete siano piuttosto comodi per la condivisione dei dati, possono essere non sicuri. La loro connessione di rete deve essere resa sicura nel modo seguente.
Vedere anche Sezione 6.10, «Altri server di rete» e Sezione 6.11, «Altri client di rete».
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 | |
---|---|
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.
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
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
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 | |
---|---|
Non fare il backup dei contenuti dei pseudo file system che si trovano in
|
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 | |
---|---|
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 | |
---|---|
Si dovrebbe dare un'attenzione particolare al backup ed al ripristino di
file con dati relativi all'identità dell'utente, come
" |
Nota | |
---|---|
Se si esegue un compito di cron come processo di un utente, si deve
ripristinare i file nella directory
" |
Quello che segue è un elenco di importanti suite di utilità di backup disponibili in un sistema Debian
Tabella 10.5. Elenco di suite con utilità di backup
pacchetto | popcon | dimensione | descrizione |
---|---|---|---|
dump
|
V:1, I:6 | 340 | dump(8) e restore(8) di BSD 4.4 per file system ext2/ext3/ext4 |
xfsdump
|
V:0, I:10 | 834 | dump e ripristino con xfsdump(8) e xfsrestore(8) per file system XFS in GNU/Linux e IRIX |
backupninja
|
V:4, I:4 | 355 | sistema di meta-backup leggero ed estensibile |
bacula-common
|
V:10, I:17 | 2369 | Bacula: backup, ripristino e controllo in rete - file comuni di supporto |
bacula-client
|
I:4 | 175 | Bacula: backup, ripristino e controllo in rete - metapacchetto client |
bacula-console
|
V:1, I:6 | 75 | Bacula: backup, ripristino e controllo in rete - console testuale |
bacula-server
|
I:1 | 175 | Bacula: backup, ripristino e controllo in rete - metapacchetto server |
amanda-common
|
V:1, I:2 | 9890 | Amanda: Advanced Maryland Automatic Network Disk Archiver (Librerie) |
amanda-client
|
V:1, I:2 | 1133 | Amanda: Advanced Maryland Automatic Network Disk Archiver (Client) |
amanda-server
|
V:0, I:0 | 1089 | Amanda: Advanced Maryland Automatic Network Disk Archiver (Server) |
backup-manager
|
V:1, I:2 | 571 | strumento di backup a riga di comando |
backup2l
|
V:0, I:1 | 114 | strumento di backup/ripristino per supporti montabile (basato su dischi) che richiede bassa manutenzione |
backuppc
|
V:4, I:4 | 2284 | BackupPC è un sistema ad altre prestazioni di qualità professionale per il backup di PC (basato su dischi) |
duplicity
|
V:8, I:15 | 1609 | backup incrementali (remoti) |
flexbackup
|
V:0, I:0 | 243 | backup incrementali (remoti) |
rdiff-backup
|
V:8, I:16 | 704 | backup incrementali (remoti) |
restic
|
V:0, I:1 | 22182 | backup incrementali (remoti) |
rsnapshot
|
V:6, I:11 | 452 | backup incrementali (remoti) |
slbackup
|
V:0, I:0 | 152 | backup incrementali (remoti) |
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.
Backup regolari dei dati degli utenti possono essere realizzati 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 restic
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 | |
---|---|
Per imparare ulteriori informazioni sul pacchetto |
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.
Modificare lo script per includere tutti i propri dati importanti (vedere Sezione 10.1.5, «Esempi di invocazione per la selezione di file» e Sezione 10.2, «Backup e ripristino»).
Sostituire "find … -print0
" con "find … -newer
$BUDIR/backup.stamp -print0
" per fare backup incrementali.
Trasferire i file di backup su un host remoto usando scp(1) o rsync(1) o masterizzarli su CD/DVD per una maggiore sicurezza dei dati. (Io uso la GUI del desktop GNOME per masterizzare i CD/DVD.. Vedere Sezione 12.1.8, «Esempio di script di shell con zenity» per l'inserimento di dati di ridondanza.)
Mantenere le cose semplici!
Suggerimento | |
---|---|
Si possono ripristinare i dati di configurazione di debconf con
" |
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 | |
---|---|
Io tengo questo script |
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.
Tabella 10.6. Elenco di strumenti per l'infrastruttura di sicurezza dei dati
pacchetto | popcon | dimensione | comando | descrizione |
---|---|---|---|---|
gnupg
|
V:737, I:996 | 727 | gpg(1) | GNU Privacy Guard - strumento OpenPGP di cifratura e firma |
gpgv
|
V:880, I:999 | 840 | gpgv(1) | GNU Privacy Guard - strumento di verifica delle firme |
paperkey
|
V:0, I:6 | 58 | paperkey(1) | estrae solamente le informazioni segrete da chiavi OpenPGP segrete |
cryptsetup
|
V:32, I:80 | 67 | cryptsetup(8), … | utilità per la cifratura dm-crypto per i device a blocchi con supporto LUKS |
ecryptfs-utils
|
V:5, I:8 | 396 | ecryptfs(7), … | utilità per cifratura di file system stack ecryptfs |
coreutils
|
V:888, I:999 | 15719 | md5sum(1) | calcola e controlla message digest MD5 |
coreutils
|
V:888, I:999 | 15719 | sha1sum(1) | calcola e controlla message digest SHA1 |
openssl
|
V:808, I:992 | 1452 | openssl(1ssl) |
calcola message digest con "openssl dgst " (OpenSSL)
|
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.
Tabella 10.7. Elenco di comandi per GNU Privacy Guard per la gestione delle chiavi
comando | descrizione |
---|---|
gpg --gen-key
|
Genera una nuova chiave |
gpg --gen-revoke mio_ID_utente
|
genera una chiave di revoca per mio_ID_utente |
gpg --edit-key user_ID
|
modifica la chiave in modo interattivo, "help" per l'aiuto |
gpg -o file --export
|
esporta tutte le chiavi in un file |
gpg --import file
|
importa tutte le chiavi da un file |
gpg --send-keys ID_utente
|
invia la chiave di ID_utente al server di chiavi |
gpg --recv-keys ID_utente
|
riceve la chiave di ID_utente dal server di chiavi |
gpg --list-keys ID_utente
|
elenca le chiavi di ID_utente |
gpg --list-sigs ID_utente
|
elenca le firme di ID_utente |
gpg --check-sigs ID_utente
|
controlla le firme di ID_utente |
gpg --fingerprint ID_utente
|
controlla le impronte digitali di ID_utente |
gpg --refresh-keys
|
aggiorna il portachiavi locale |
Quelli seguenti sono i significati dei codici di fiducia.
Tabella 10.8. Elenco dei significati dei codici di fiducia
codice | descrizione della fiducia |
---|---|
-
|
nessuna fiducia assegnata dal proprietario / ancora non calcolata |
e
|
calcolo della fiducia fallito |
q
|
informazioni insufficienti per il calcolo |
n
|
non fidarsi mai di questa chiave |
m
|
marginalmente affidabile |
f
|
completamente fidata |
u
|
definitivamente fidata |
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).
Quelli seguenti sono esempi di comandi per usare GNU Privacy Guard su file.
Tabella 10.9. Elenco di comandi GNU Privacy Guard per file
comando | descrizione |
---|---|
gpg -a -s file
|
firma un file in file.asc con corazza ASCII |
gpg --armor --sign file
|
" " |
gpg --clearsign file
|
inserisce una firma leggibile nel messaggio |
gpg --clearsign file|mail pippo@example.org
|
invia un messaggio di posta firmato leggibile a
pippo@example.org
|
gpg --clearsign --not-dash-escaped patchfile
|
inserisce una firma leggibile in patchfile |
gpg --verify file
|
verifica un file con firma leggibile |
gpg -o file.sig -b file
|
crea una firma staccata |
gpg -o file.sig --detach-sig file
|
" " |
gpg --verify file.sig file
|
verifica file con file.sig |
gpg -o cifr_file.gpg -r nome -e file
|
cifratura di file nel file binario cifr_file.gpg usando la chiave pubblica indirizzata a nome |
gpg -o cifr_file.gpg --recipient nome --encrypt file
|
" " |
gpg -o cifr_file.asc -a -r nome -e file
|
cifratura di file nel file con cifratura corazzata ASCII cifr_file.asc usando la chiave pubblica indirizzata a nome |
gpg -o cifr_file.gpg -c file
|
cifratura simmetrica da file a cifr_file.gpg |
gpg -o cifr_file.gpg --symmetric file
|
" " |
gpg -o cifr_file.asc -a -c file
|
cifratura simmetrica pensata per nome di file nel file con cifratura corazzata ASCII cifr_file.asc |
gpg -o file -d cifr_file.gpg -r nome
|
decifratura |
gpg -o file --decrypt cifr_file.gpg
|
" " |
Aggiungere quanto seguie al file "~/.muttrc
" per evitare
che il lento GnuPG venga avviato automaticamente, permettendo allo stesso
tempo di richiamarlo digitando "S
" nel menu della vista
indice.
macro index S ":toggle pgp_verify_sig\n" set pgp_verify_sig=no
Il plugin gnupg
permette di eseguire GnuPG in modo
trasparente per i file con estensione ".gpg
",
".asc
" e ".pgp
".
# aptitude install vim-scripts vim-addon-manager $ vim-addons install gnupg
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 | |
---|---|
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:874, I:987 | 1574 | diff(1) | confronta i file riga per riga |
diffutils
|
V:874, I:987 | 1574 | diff3(1) | confronta e fonde tre file riga per riga |
vim
|
V:119, I:395 | 2799 | vimdiff(1) | confronta 2 file uno di fianco all'altro in vim |
patch
|
V:115, I:779 | 243 | patch(1) | applica un file diff ad un originale |
dpatch
|
V:1, I:13 | 191 | dpatch(1) | gestisce serie di patch per pacchetti Debian |
diffstat
|
V:17, I:179 | 69 | diffstat(1) | produce un istogramma delle modifiche apportate da un diff |
patchutils
|
V:19, I:173 | 223 | combinediff(1) | crea una patch cumulativa da due patch incrementali |
patchutils
|
V:19, I:173 | 223 | dehtmldiff(1) | estrae un diff da una pagina HTML |
patchutils
|
V:19, I:173 | 223 | filterdiff(1) | estrae o esclude diff da un file diff |
patchutils
|
V:19, I:173 | 223 | fixcvsdiff(1) | aggiusta file diff creati da CVS che sono male interpretati da patch(1) |
patchutils
|
V:19, I:173 | 223 | flipdiff(1) | scambia l'ordine di due patch |
patchutils
|
V:19, I:173 | 223 | grepdiff(1) | mostra quali file siano modificati da una patch che fa corrispondenza con un'espressione regolare |
patchutils
|
V:19, I:173 | 223 | interdiff(1) | mostra le differenze tra due file diff unificati |
patchutils
|
V:19, I:173 | 223 | lsdiff(1) | mostra quali file vengano modificati da una patch |
patchutils
|
V:19, I:173 | 223 | recountdiff(1) | ricalcola conteggi e offset in diff unificati |
patchutils
|
V:19, I:173 | 223 | rediff(1) | aggiusta conteggi ed offset di un diff modificato a mano |
patchutils
|
V:19, I:173 | 223 | splitdiff(1) | separa due patch incrementali |
patchutils
|
V:19, I:173 | 223 | unwrapdiff(1) | ripristina patch il cui contenuto è stato mandato a capo automaticamente |
wiggle
|
V:0, I:0 | 174 | wiggle(1) | applica le patch respinte |
quilt
|
V:3, I:38 | 785 | quilt(1) | gestisce serie di patch |
meld
|
V:17, I:42 | 2942 | meld(1) | confronta e fonde file (GTK) |
dirdiff
|
V:0, I:2 | 161 | 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 |
imediff
|
V:0, I:0 | 157 | imediff(1) | strumento interattivo a tutto schermo per unione di modifiche a 2/3 vie |
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:8, I:77 | 644 | wdiff(1) | mostra le differenze di parole tra file di testo |
Si possono estrarre le differenze tra due file sorgenti e creare file diff
unificati "file.patch0
" o
"file.patch1
", a seconda della posizione del file, con le
procedure seguenti.
$ diff -u file.vecchio file.nuovo > file.patch0 $ diff -u vecchio/file nuovo/file > file.patch1
I file diff (chiamati anche file patch) sono usati per inviare aggiornamenti per un programma. Chi li riceve applica questo aggiornamento ad un altro file nel modo seguente.
$ patch -p0 file < file.patch0 $ patch -p1 file < file.patch1
Ecco un riassunto dei sistemi di controllo delle versioni (VCS) nel sistema Debian.
Nota | |
---|---|
Se non si ha esperienza di sistemi VCS, si dovrebbe iniziare ad imparare con Git che sta acquistando sempre più popolarità. |
Tabella 10.11. Elenco di strumenti per sistemi di controllo delle versioni
pacchetto | popcon | dimensione | strumento | tipo di VCS | commento |
---|---|---|---|---|---|
cssc
|
V:0, I:2 | 2035 | CSSC | locale | clone di SCCS Unix (deprecato) |
rcs
|
V:3, I:21 | 555 | RCS | locale | "SCCS Unix fatto bene" |
cvs
|
V:5, I:49 | 4596 | CVS | remoto | precedente standard per VCS remoto |
subversion
|
V:27, I:131 | 4809 | Subversion | remoto | "CVS fatto bene", il nuovo standard di fatto per VCS remoto |
git
|
V:301, I:458 | 35266 | Git | distribuito | veloce DVCS in C (usato dal kernel Linux ed altri) |
mercurial
|
V:11, I:56 | 913 | Mercurial | distribuito | DVCS in Python e un po' di C |
bzr
|
V:3, I:20 | 74 | Bazaar | distribuito |
DVCS influenzato da tla , scritto in Python (usato da
Ubuntu)
|
darcs
|
V:0, I:8 | 27950 | Darcs | distribuito | DVCS con algebra intelligente per le patch (lento) |
tla
|
V:0, I:6 | 1011 | GNU arch | distribuito | DVCS principalmente di Tom Lord (storico) |
monotone
|
V:0, I:0 | 5815 | Monotone | distribuito | DVCS in C++ |
tkcvs
|
V:0, I:1 | 1498 | CVS, … | remoto | visualizzazione GUI di alberi di archivi VCS (CVS, Subversion, RCS) |
gitk
|
V:8, I:47 | 1539 | Git | distribuito | visualizzazione GUI di alberi di repository VCS (Git) |
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 Git liberi attraverso il servizio Debian Salsa. La sua documentazione è reperibile su https://wiki.debian.org/Salsa.
Attenzione | |
---|---|
Debian ha chiuso i suoi vecchi servizi Alioth e i dati del vecchio servizio Alioth sono disponibili in alioth-archive come archivi tar. |
Ci sono alcune nozioni base da ricordare per creare un accesso condiviso ad un archivio VCS.
Usare "umask 002
" (vedere Sezione 1.2.4, «Controllo dei permessi per i file appena creati: umask»)
Far sì che tutti i file dell'archivio VCS appartengano ad un gruppo pertinente
Abilitare l'impostazione dell'ID di gruppo per tutte le directory dell'archivio VCS (schema di creazione di file in stile BSD, vedere Sezione 1.2.3, «Permessi del file system»)
Far sì che gli utenti che condividano l'archivio VCS appartengano al gruppo
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.
Tabella 10.12. Comparazione di comandi VCS nativi
Git | CVS | Subversion | funzione |
---|---|---|---|
git init
|
cvs init
|
svn create
|
creazione dell'archivio (locale) |
- |
cvs login
|
- | login all'archivio remoto |
git clone
|
cvs co
|
svn co
|
fare il check out dell'archivio remoto come albero di directory di lavoro |
git pull
|
cvs up
|
svn up
|
aggiornare l'albero di lavoro fondendovi l'archivio remoto |
git add .
|
cvs add
|
svn add
|
aggiungere il/i file nell'albero di lavoro al VCS |
git rm
|
cvs rm
|
svn rm
|
rimuovere il/i file nell'albero di lavoro dal VCS |
- |
cvs ci
|
svn ci
|
fare il commit dei cambiamenti all'archivio remoto |
git commit -a
|
- | - | fare il commit dei cambiamenti all'archivio locale |
git push
|
- | - | aggiornare l'archivio remoto con l'archivio locale |
git status
|
cvs status
|
svn status
|
visualizza lo stato dell'albero di lavoro dal VCS |
git diff
|
cvs diff
|
svn diff
|
diff <archivio_diriferimento> <albero_di_lavoro> |
git repack -a -d; git prune
|
- | - | reimpacchetta l'archivio locale in un singolo pacchetto |
gitk
|
tkcvs
|
tkcvs
|
visualizzazione GUI dell'albero dell'archivio VCS |
Attenzione | |
---|---|
A partire dall'inizio del 2006, l'invocazione diretta, dalla riga di
comando, di un sottocomando di |
Suggerimento | |
---|---|
Se c'è un file eseguibile |
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 | |
---|---|
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 |
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.
È possibile che si desideri impostare diverse configurazioni globali, come
il nome e l'indirizzo di posta elettronica usati da Git, in
"~/.gitconfig
" nel modo seguente.
$ git config --global user.name "Nome Cognome" $ git config --global user.email proprionome@esempio.com
Se si è abituati ai comandi di CVS o Subversion, si potrebbe volere impostare alcuni alias per i comandi nel modo seguente.
$ git config --global alias.ci "commit -a" $ git config --global alias.co checkout
La configurazione globale può essere controllata con il comando seguente.
$ git config --global --list
Vedere la documentazione seguente.
pagina man: git(1)
(/usr/share/doc/git-doc/git.html
)
Manuale utente di Git
(/usr/share/doc/git-doc/user-manual.html
)
Un tutorial introduttivo su
git (/usr/share/doc/git-doc/gittutorial.html
)
Un tutorial introduttivo su
git: parte seconda
(/usr/share/doc/git-doc/gittutorial-2.html
)
Uso quotidiano di GIT con 20
comandi o poco più
(/usr/share/doc/git-doc/everyday.html
)
git per gli utenti CVS
(/usr/share/doc/git-doc/gitcvs-migration.html
)
Questo descrive anche come impostare server come CVS ed estrarre vecchi dati da CVS portandoli in Git.
Altre risorse git disponibili in rete
Git Magic
(/usr/share/doc/gitmagic/html/index.html
)
I comandi git-gui(1) e gitk(1) rendono l'uso di Git molto semplice.
Avvertimento | |
---|---|
Non usare stringhe per etichette contenenti spazi, anche se alcuni strumenti
come
gitk(1)
lo permettono. Altri comandi |
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).
Tabella 10.13. Elenco di pacchetti e comandi relativi a Git
pacchetto | popcon | dimensione | comando | descrizione |
---|---|---|---|---|
git-doc
|
I:18 | 11118 | N/D | documentazione ufficiale per Git |
gitmagic
|
I:1 | 719 | N/D | "Git Magic", una guida per Git più semplice da capire |
git
|
V:301, I:458 | 35266 | git(7) | Git, il sistema di controllo delle revisioni veloce, scalabile e distribuito |
gitk
|
V:8, I:47 | 1539 | gitk(1) | browser degli archivi Git con interfaccia utente grafica e cronologia |
git-gui
|
V:2, I:27 | 2266 | git-gui(1) | interfaccia utente grafica per Git (senza cronologia) |
git-svn
|
V:2, I:26 | 1037 | git-svnimport(1) | importa i dati da Subversion in Git |
git-svn
|
V:2, I:26 | 1037 | git-svn(1) | fornisce operazioni bidirezionali tra Subversion e Git |
git-cvs
|
V:0, I:12 | 1172 | git-cvsimport(1) | importa i dati da CVS in Git |
git-cvs
|
V:0, I:12 | 1172 | git-cvsexportcommit(1) | esporta un commit a un checkout CVS da Git |
git-cvs
|
V:0, I:12 | 1172 | git-cvsserver(1) | emulatore di server CVS per Git |
git-email
|
V:0, I:13 | 860 | git-send-email(1) | invia una raccolta di patch come messaggio di posta da Git |
stgit
|
V:0, I:0 | 1535 | stg(1) | quilt sopra a git (Python) |
git-buildpackage
|
V:2, I:12 | 3928 | git-buildpackage(1) | automatizza la creazione di pacchetti Debian con Git |
guilt
|
V:0, I:0 | 146 | guilt(7) | quilt sopra a git (SH/AWK/SED/…) |
Suggerimento | |
---|---|
Con
git(1)
si lavora su un ramo locale con molti commit e si usa successivamente un
comando simile a " |
Suggerimento | |
---|---|
Quando si vuole tornare ad una directory di lavoro pulita senza perdere lo
stato attuale della directory di lavoro, si può usare " |
Si può fare il check out di un repository Subversion su
"svn+ssh://svn.example.org/project/module/trunk
" in un
repository Git locale in "./dest
" fare poi nuovamente il
commit sul repository Subversion.
Ad esempio:
$ git svn clone -s -rHEAD svn+ssh://svn.esempio.org/progetto dest $ cd dest ... fare i cambiamenti $ git commit -a ... continuare a lavorare localmente con git $ git svn dcommit
Suggerimento | |
---|---|
L'uso di " |
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 | |
---|---|
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
|
Nota | |
---|---|
Il comando " |
Suggerimento | |
---|---|
Per l'impostazione di un sistema di registrazione della configurazione più
completo, guardare il pacchetto |
CVS è un sistema di controllo di versione più vecchio antecedente a Subversion e Git.
Attenzione | |
---|---|
Molti URL negli esempi sottostanti per CVS non esistono più. |
Vedere la documentazione seguente.
cvs(1)
"/usr/share/doc/cvs/html-cvsclient
"
"/usr/share/doc/cvs/html-info
"
"/usr/share/doc/cvsbook
"
"info cvs
"
La configurazione seguente permette solo ai membri del gruppo
"src
" di fare commit nell'archivio CVS e solo ai membri
del gruppo "staff
" di amministrare il CVS, riducendo
perciò le possibilità di autodanneggiarsi.
# cd /var/lib; umask 002; mkdir cvs # export CVSROOT=/srv/cvs/progetto # cd $CVSROOT # chown root:src . # chmod 2775 . # cvs -d $CVSROOT init # cd CVSROOT # chown -R root:staff . # chmod 2775 . # touch val-tags # chmod 664 history val-tags # chown root:src history val-tags
Suggerimento | |
---|---|
Si può limitare la creazione di nuovi progetti modificando il proprietario
della directory " |
L'archivio CVS predefinito è indicato da "$CVSROOT
". Il
comando seguente imposta "$CVSROOT
" per l'accesso locale.
$ export CVSROOT=/srv/cvs/progetto
Molti server CVS pubblici forniscono accesso remoto solo in lettura
all'account "anonymous
" tramite il servizio pserver. I
contenuti del sito Debian, per esempio, erano mantenuti dal progetto webwml attraverso CVS sul servizio
Debian Alioth. Il comando seguente veniva usato per impostare
"$CVSROOT
" per l'accesso remoto al questo vecchio
repository CVS.
$ export CVSROOT=:pserver:anonymous@anonscm.debian.org:/cvs/webwml $ cvs login
Nota | |
---|---|
Dato che pserver è esposto ad attacchi di spionaggio ed è insicuro, l'accesso in scrittura è solitamente disabilitato dagli amministratori del server. |
Il comando seguente veniva usato per impostare "$CVS_RSH
"
e "$CVSROOT
" per l'accesso remoto con SSH al vecchio
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.
Creare un nuovo albero di sorgenti locale in
"~/percorso/di/modulo1
" con il comando seguente.
$ mkdir -p ~/percorso/di/modulo1; cd ~/percorso/di/modulo1
Popolare il nuovo albero di sorgenti locale in
"~/percorso/di/modulo1
" con i file.
Importarlo nel CVS con i parametri seguenti.
Nome modulo: "modulo1
"
Etichetta fornitore: "Ramo-principale
" (etichetta per
l'intero ramo)
Etichetta rilascio: "Rilascio-iniziale
" (etichetta per un
rilascio specifico)
$ cd ~/percorso/di/modulo1 $ cvs import -m "Inizio di modulo1" Ramo-principale Rilascio-iniziale $ rm -Rf . # opzionale
CVS non sovrascrive i file attuali nell'archivio, ma li sostituisce con
altri. Perciò i permessi di scrittura della directory dell'archivio sono
fondamentali. Per ogni nuovo modulo di modulo1
"
nell'archivio in "/srv/cvs/progetto
", eseguire i comandi
seguenti per assicurare che i permessi siano corretti, se necessario.
# cd /srv/cvs/progetto # chown -R root:src modulo1 # chmod -R ug+rwX modulo1 # chmod 2775 modulo1
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 | |
---|---|
Per specificare una particolare data come punto di ramificazione, usare
" |
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 | |
---|---|
Il comando " |
Suggerimento | |
---|---|
Si può fare il checkout solamente di una sottodirectory di
" |
Tabella 10.14. Opzioni importanti per comandi CVS (da usare come primi argomenti di cvs(1))
opzione | significato |
---|---|
-n
|
esecuzione di prova, nessun effetto |
-t
|
visualizza i messaggi che mostrano i passi dell'attività di cvs |
Per ottenere i file più recenti dal CVS usare "tomorrow
"
nel modo seguente.
$ cvs ex -D tomorrow nome_modulo
Aggiungere l'alias "mx
" per un modulo ad un progetto CVS
(server locale) usando il comando seguente.
$ export CVSROOT=/srv/cvs/progetto $ cvs co CVSROOT/moduli $ cd CVSROOT $ echo "mx -a modulo1" >>moduli $ cvs ci -m "Ora mx e' un alias per modulo1" $ cvs release -d .
Ora si può fare il checkout di "modulo1
" (alias:
"mx
") dal CVS alla directory "nuova
"
nel modo seguente.
$ cvs co -d nuova mx $ cd nuova
Nota | |
---|---|
Per seguire la procedura precedente sono necessari gli adeguati permessi sui file. |
Quando si fa il checkout di file dal CVS viene mantenuto il loro bit del permesso di esecuzione.
Ogni volta si incontrano problemi con i permessi di esecuzione di un file di
cui si è fatto il checkout, ad esempio "nomefile
", per
risolverli cambiare i suoi permessi nell'archivio CVS corrispondente nel
modo seguente.
# chmod ugo-x nomefile
Subversion è un sistema di controllo delle versioni di vecchio antecedente a Git, ma successivo a CVS. Manca delle funzionalità per etichette e rami che si trovano in CVS e Git.
Per impostare un server Subversion è necessario installare i pacchetti
subversion
, libapache2-mod-svn
e
subversion-tools
.
Attualmente il pacchetto subversion
non imposta un
archivio, perciò è necessario farlo manualmente. Una possibile collocazione
per un archivio è in "/srv/svn/progetto
".
Creare una directory con il comando seguente
# mkdir -p /srv/svn/progetto
Creare il database dell'archivio con il comando seguente.
# svnadmin create /srv/svn/progetto
Se si accede all'archivio Subversion solamente attraverso il server Apache2, è necessario soltanto rendere l'archivio scrivibile dal server WWW, nel modo seguente.
# chown -R www-data:www-data /srv/svn/progetto
Per permettere l'accesso all'archivio tramite autenticazione dell'utente
aggiungere (o decommentare) quanto segue in
"/etc/apache2/mods-available/dav_svn.conf
".
<Location /progetto> DAV svn SVNPath /srv/svn/progetto AuthType Basic AuthName "Subversion repository" AuthUserFile /etc/subversion/passwd <LimitExcept GET PROPFIND OPTIONS REPORT> Require valid-user </LimitExcept> </Location>
Creare un file di autenticazione dell'utente con il comando seguente.
# htpasswd2 -c /etc/subversion/passwd un-qualche-nomeutente
Riavviare Apache2.
Il nuovo archivio Subversion è accessibile da
svn(1)
agli URL "http://localhost/progetto
" e
"http://esempio.com/progetto
" (assumendo che l'URL del
proprio server web sia "http://esempio.com/
").
I comandi seguenti impostano l'archivio Subversion per l'accesso locale da
parte di un gruppo, ad esempio progetto
.
# chmod 2775 /srv/svn/progetto # chown -R root:src /srv/svn/progetto # chmod -R ug+rwX /srv/svn/progetto
Il nuovo archivio Subversion è accessibile con
svn(1)
per gli utenti locali che appartengono al gruppo
progetto
, all'URL
"file:///localhost/srv/svn/progetto
" o
"file:///srv/svn/progetto
". Per assicurare l'accesso al
gruppo è necessario usare i programmi come svn
,
svnserve
, svnlook
e
svnadmin
con "umask 002
".
Se esiste un archivio Subversion accessibile da un gruppo all'URL
"esempio.com:/srv/svn/progetto
", si può accedere ad esso
con
svn(1)
e SSH all'URL "svn+ssh://esempio.com:/srv/svn/progetto
".
Per compensare la mancanza di rami ed etichette in Subversion, molti progetti usano con esso un albero di directory simile al seguente.
----- modulo1 | |-- branches | |-- tags | | |-- rilascio-1.0 | | `-- rilascio-2.0 | | | `-- trunk | |-- file1 | |-- file2 | `-- file3 | `-- modulo2
Suggerimento | |
---|---|
Per marcare i rami e le etichette è necessario usare il comando
" |
Creare un nuovo albero di sorgenti locale in
"~/percorso/di/modulo1
" con il comando seguente.
$ mkdir -p ~/percorso/di/modulo1; cd ~/percorso/di/modulo1
Popolare il nuovo albero di sorgenti locale in
"~/percorso/di/modulo1
" con i file.
Importarlo In Subversion con i parametri seguenti.
Nome modulo: "modulo1
"
URL sito Subversion: "file:///srv/svn/progetto
"
Directory Subversion: "modulo1/trunk
"
Etichetta Subversion: "modulo1/tags/Rilascio-iniziale
"
$ cd ~/percorso/di/modulo1 $ svn import file:///srv/svn/progetto/modulo1/trunk -m "Inizo di modulo1" $ svn cp file:///srv/svn/progetto/modulo1/trunk file:///srv/svn/progetto/modulo1/tags/Rilascio-iniziale
In alternativa usare i comandi seguenti.
$ svn import ~/percorso/di/modulo1 file:///srv/svn/progetto/modulo1/trunk -m "Inizo di modulo1" $ svn cp file:///srv/svn/progetto/modulo1/trunk file:///srv/svn/progetto/modulo1/tags/Rilascio-iniziale
Suggerimento | |
---|---|
Si possono sostituire gli URL come " |
Ecco un esempio di una sequenza tipica di azioni svolte nell'uso di Subversion con il suo client nativo.
Suggerimento | |
---|---|
I comandi client forniti dal pacchetto |
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 | |
---|---|
Per specificare una particolare data come punto di ramificazione, usare
" |
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 | |
---|---|
Si possono sostituire gli URL come " |
Suggerimento | |
---|---|
Si può fare il checkout solamente di una sottodirectory di
" |
Tabella 10.15. Opzioni importanti per comandi Subversion (da usare come primi argomenti di svn(1))
opzione | significato |
---|---|
--dry-run
|
esecuzione di prova, nessun effetto |
-v
|
visualizza messaggi dettagliati sull'attività di svn |