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. Backup and recovery policy
10.2.2. Suite con utilità di backup
10.2.3. Personal backup
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.3.6. Password keyring
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. Interactive merge
10.5. Git
10.5.1. Configurazione del client Git
10.5.2. Basic Git commands
10.5.3. Git tips
10.5.4. Documenti di consultazione per Git
10.5.5. Other version control systems

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:904, I:999 3152 .tar tar(1) strumento di archiviazione standard (standard de facto)
cpio V:392, I:998 1140 .cpio cpio(1) strumento di archiviazione Unix in stile System V, da usare con find(1)
binutils V:160, I:657 98 .ar ar(1) strumento di archiviazione per la creazione di librerie statiche
fastjar V:2, I:23 183 .jar fastjar(1) strumento di archiviazione per Java (simile a zip)
pax V:11, I:22 170 .pax pax(1) nuovo strumento POSIX di archiviazione, compromesso tra tar e cpio
gzip V:878, I:999 242 .gz gzip(1), zcat(1), … utilità GNU di compressione LZ77 (standard de facto)
bzip2 V:161, I:974 122 .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:2, I:24 149 .lzma lzma(1) LZMA compression utility with higher compression ratio than gzip(1) (deprecated)
xz-utils V:437, I:980 612 .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)
zstd V:5, I:29 1898 .zstd zstd(1), zstdcat(1), … Zstandard fast lossless compression utility
p7zip V:84, I:471 987 .7z 7zr(1), p7zip(1) strumento di archiviazione file 7-Zip con alto rapporto di compressione (compressione LZMA)
p7zip-full V:117, I:485 4664 .7z 7z(1), 7za(1) strumento di archiviazione file 7-Zip con alto rapporto di compressione (compressione LZMA e altre)
lzop V:12, I:111 164 .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:48, I:420 623 .zip zip(1) InfoZIP: strumento di archiviazione e compressione per DOS
unzip V:141, I:793 385 .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).

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 ./source; rsync -aHAXSv . /dest
# cd ./source; rsync -aHAXSv . user@host.dom:/dest

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

# rsync -aHAXSv ./source/ /dest
# rsync -aHAXSv ./source/ user@host.dom:/dest

In alternativa usare i comandi seguenti.

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

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

# cd ./source; cp -a . /dest
# cd ./source; scp -pr . user@host.dom:/dest

GNU tar(1):

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

cpio(1):

# cd ./source; 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.4.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".

  • udisks2 package provides a daemon and associated utilities to mount and unmount these devices.

  • 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".

Mount point under modern desktop environment is chosen as "/media/username/disk_label" which can be customized by the following.

  • 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.1.3, «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.9.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

  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

    • Risk of data when lost

      • Data should be at least on different disk partitions preferably on different disks and machines to withstand the filesystem corruption. Important data are best stored on a read-only filesystem. [4]

    • Risk of data when breached

      • Sensitive identity data such as "/etc/ssh/ssh_host_*_key", "~/.gnupg/*", "~/.ssh/*", "~/.local/share/keyrings/*", "/etc/passwd", "/etc/shadow", "popularity-contest.conf", "/etc/ppp/pap-secrets", and "/etc/exim4/passwd.client" should be backed up as encrypted. [5] (See Sezione 9.9, «Suggerimenti per la cifratura dei dati».)

      • Never hard code system login password nor decryption passphrase in any script even on any trusted system. (See Sezione 10.3.6, «Password keyring».)

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

      • Hardware (especially HDD) will break

      • Filesystem may be corrupted and data in it may be lost

      • Remote storage system can't be trusted for security breaches

      • Weak password protection can be easily compromised

      • File permission system may be compromised

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

      • Automatic scheduled backup with cron job or systemd timer job

[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à.

[Nota] Nota

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

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 351 dump(8) e restore(8) di BSD 4.4 per file system ext2/ext3/ext4
xfsdump V:0, I:8 854 dump e ripristino con xfsdump(8) e xfsrestore(8) per file system XFS in GNU/Linux e IRIX
backupninja V:3, I:4 367 sistema di meta-backup leggero ed estensibile
bacula-common V:9, I:13 2158 Bacula: backup, ripristino e controllo in rete - file comuni di supporto
bacula-client I:3 183 Bacula: backup, ripristino e controllo in rete - metapacchetto client
bacula-console V:1, I:4 107 Bacula: backup, ripristino e controllo in rete - console testuale
bacula-server I:1 183 Bacula: backup, ripristino e controllo in rete - metapacchetto server
amanda-common V:0, I:2 9998 Amanda: Advanced Maryland Automatic Network Disk Archiver (Librerie)
amanda-client V:0, I:2 1088 Amanda: Advanced Maryland Automatic Network Disk Archiver (Client)
amanda-server V:0, I:0 1090 Amanda: Advanced Maryland Automatic Network Disk Archiver (Server)
backup-manager V:1, I:1 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:2, I:3 3184 BackupPC è un sistema ad altre prestazioni di qualità professionale per il backup di PC (basato su dischi)
duplicity V:13, I:32 1834 backup incrementali (remoti)
flexbackup V:0, I:0 243 backup incrementali (remoti)
rdiff-backup V:5, I:13 733 backup incrementali (remoti)
restic V:1, I:4 21080 backup incrementali (remoti)
slbackup V:0, I:0 151 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.

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

  • Regular backups of user data can be realized by a simple script (Sezione 10.2.3, «Personal backup»).

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] Suggerimento

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

For a personal Debian desktop system running testing suite, I only need to protect personal and critical data. I reinstall system once a year anyway. Thus I see no reason to backup the whole system or to install a full featured backup utility.

At the same time, it is very valuable to have frequent recent snapshots of personal data and system configuration, and occasional full backups of personal data.

I usually make these snapshots and backups with a simple shell script bss. This script is a short shell which uses standard utilities: btrfs subvolume snapshot, rsync. For data encryption, disk image is created by fallocate(1) and configured with cryptsetup(8).

[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".

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


See Sezione 9.9, «Suggerimenti per la cifratura dei dati» on dm-crypt and fscrypt which implement automatic data encryption infrastructure via Linux kernel modules.

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 foo bar >baz.md5
$ cat baz.md5
d3b07384d113edec49eaa6238ad5ff00  foo
c157a79031e1c40f85931829bc5fc552  bar
$ md5sum -c baz.md5
foo: OK
bar: 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
patch V:75, I:714 248 patch(1) applica un file diff ad un originale
vim V:103, I:394 3498 vimdiff(1) confronta 2 file uno di fianco all'altro in vim
imediff V:0, I:0 169 imediff(1) strumento interattivo a tutto schermo per unione di modifiche a 2/3 vie
meld V:14, I:37 3086 meld(1) confronta e fonde file (GTK)
wiggle V:0, I:0 174 wiggle(1) applica le patch respinte
diffutils V:870, I:993 1598 diff(1) confronta i file riga per riga
diffutils V:870, I:993 1598 diff3(1) confronta e fonde tre file riga per riga
quilt V:3, I:30 788 quilt(1) gestisce serie di patch
wdiff V:8, I:65 644 wdiff(1) mostra le differenze di parole tra file di testo
diffstat V:14, I:143 81 diffstat(1) produce un istogramma delle modifiche apportate da un diff
patchutils V:16, I:139 232 combinediff(1) crea una patch cumulativa da due patch incrementali
patchutils V:16, I:139 232 dehtmldiff(1) estrae un diff da una pagina HTML
patchutils V:16, I:139 232 filterdiff(1) estrae o esclude diff da un file diff
patchutils V:16, I:139 232 fixcvsdiff(1) aggiusta file diff creati da CVS che sono male interpretati da patch(1)
patchutils V:16, I:139 232 flipdiff(1) scambia l'ordine di due patch
patchutils V:16, I:139 232 grepdiff(1) mostra quali file siano modificati da una patch che fa corrispondenza con un'espressione regolare
patchutils V:16, I:139 232 interdiff(1) mostra le differenze tra due file diff unificati
patchutils V:16, I:139 232 lsdiff(1) mostra quali file vengano modificati da una patch
patchutils V:16, I:139 232 recountdiff(1) ricalcola conteggi e offset in diff unificati
patchutils V:16, I:139 232 rediff(1) aggiusta conteggi ed offset di un diff modificato a mano
patchutils V:16, I:139 232 splitdiff(1) separa due patch incrementali
patchutils V:16, I:139 232 unwrapdiff(1) ripristina patch il cui contenuto è stato mandato a capo automaticamente
dirdiff V:0, I:2 166 dirdiff(1) mostra le differenze ed apporta i cambiamenti tra alberi di directory
docdiff V:0, I:0 555 docdiff(1) confronta due file parola per parola / carattere per carattere
makepatch V:0, I:0 102 makepatch(1) genera file patch estesi
makepatch V:0, I:0 102 applypatch(1) applica file patch estesi

Git is the tool of choice these days for the version control system (VCS) since Git can do everything for both local and remote source code management.

Debian fornisce servizi Git liberi attraverso il servizio Debian Salsa. La sua documentazione è reperibile su https://wiki.debian.org/Salsa.

Here are some Git related packages.


Git operation involves several data.

  • The working tree which holds user facing files and you make changes to them.

    • The changes to be recorded must be explicitly selected and staged to the index. This is git add and git rm commands.

  • The index which holds staged files.

    • Staged files will be committed to the local repository upon the subsequent request. This is git commit command.

  • The local repository which holds committed files.

    • Git records the linked history of the committed data and organizes them as branches in the repository.

    • The local repository can send data to the remote repository by git push command.

    • The local repository can receive data from the remote repository by git fetch and git pull commands.

      • The git pull command performs git merge or git rebase command after git fetch command.

      • Here, git merge combines two separate branches of history at the end to a point. (This is default of git pull without customization and may be good for upstream people who publish branch to many people.)

      • Here, git rebase creates one single branch of sequential history of the remote branch one followed by the local branch one. (This is pull.rebase true customization case and may be good for rest of us.)

  • The remote repository which holds committed files.

    • The communication to the remote repository uses secure communication protocols such as SSH or HTTPS.

The working tree is files outside of the .git/ directory. Files inside of the .git/ directory hold the index, the local repository data, and some git configuration text files.

Here is an overview of main Git commands.


Here are some Git tips.

Tabella 10.13. Git tips

Git command line funzione
gitk --all see complete Git history and operate on them such as resetting HEAD to another commit, cheery-picking patches, creating tags and branches ...
git stash get the clean working tree without loosing data
git remote -v check settings for remote
git branch -vv check settings for branch
git status show working tree status
git config -l list git settings
git reset --hard HEAD; git clean -x -d -f revert all working tree changes and clean them up completely
git rm --cached filename revert staged index changed by git add filename
git reflog get reference log (useful for recovering commits from the removed branch)
git branch new_branch_name HEAD@{6} create a new branch from reflog information
git remote add new_remote URL add a new_remote remote repository pointed by URL
git remote rename origin upstream rename the remote repository name from origin to upstream
git branch -u upstream/branch_name set the remote tracking to the remote repository upstream and its branch name branch_name.
git remote set-url origin https://foo/bar.git change URL of origin
git remote set-url --push upstream DISABLED disable push to upstream (Edit .git/config to re-enable)
git checkout -b topic_branch ; git push -u topic_branch origin make a new topic_branch and push it to origin
git branch -m oldname newname rename local branch name
git push -d origin branch_to_be_removed remove remote branch (new method)
git push origin :branch_to_be_removed remove remote branch (old method)
git checkout --orphan unconnected create a new unconnected branch
git rebase -i origin/main reorder/drop/squish commits from origin/main to clean branch history
git reset HEAD^; git commit --amend squash last 2 commits into one
git checkout topic_branch ; git merge --squash topic_branch squash entire topic_branch into a commit
git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*' convert a shallow clone to the full clone of all branches
git ime split the last commit into a series of file-by-file smaller commits etc. (imediff package required)
git repack -a -d; git prune repack the local repository into single pack (this may limit chance of lost data recovery from erased branch etc.)

[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.

[Attenzione] Attenzione

If a local branch which has been pushed to remote repository is rebased or squashed, pushing this branch has risks and requires --force option. This is usually not an acceptable for main branch but may be acceptable for a topic branch before merging to main branch.

[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

If there is a executable file git-foo in the path specified by $PATH, entering "git foo" without hyphen to the command line invokes this git-foo. This is a feature of the git command.

Vedere la documentazione seguente.



[4] A write-once media such as CD/DVD-R can prevent overwrite accidents. (See Sezione 9.8, «I dati binari» for how to write to the storage media from the shell commandline. GNOME desktop GUI environment gives you easy access via menu: "Places→CD/DVD Creator".

[5] Some of these data can not be regenerated by entering the same input string to the system.

[6] If you use "~/.vimrc" instead of "~/.vim/vimrc", please substitute accordingly.