Another common version control concept is a tag. A tag is just a “snapshot” of a project in time. In Subversion, this idea already seems to be everywhere. Each repository revision is exactly that—a snapshot of the filesystem after each commit.
Altro concetto comune del controllo delle versioni è tag(targa). Una targa è solo un'«instantanea» del progetto nel tempo. In Subversion, questa idea sembra di essere già presente ovunque. Ogni versione nel deposito(repository) è proprio questo—un'instantanea del filesystem dopo ogni commit.
However, people often want to give more human-friendly names
to tags, like release-1.0
. And they want to
make snapshots of smaller subdirectories of the filesystem.
After all, it's not so easy to remember that release-1.0 of a
piece of software is a particular subdirectory of revision
4822.
Tuttavia, gente spesso vuole dare alle targe nomi più
comprensibili, come release-1.0
. E vogliono
fare instantanee di sottocartelle più piccole. Dopo tutto,
non è così facile ricordarsi che rilascio-1.0 d'un pezzo
di software è una particolare sottocartella della versione
4822.
Once again, svn copy comes to the
rescue. If you want to create a snapshot of
/calc/trunk
exactly as it looks in the
HEAD
revision, then make a copy of it:
Ancora una volta, svn copy
vi dà una mano. Se volete creare un'instantanea di
/calc/trunk
esattamente come compare nella
versione HEAD
, fate una copia di esso:
$ svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/tags/release-1.0 \
-m "Tagging the 1.0 release of the 'calc' project."
Committed revision 351.
$ svn copy http://svn.example.com/repos/calc/trunk \ http://svn.example.com/repos/calc/tags/release-1.0 \ -m "Targato il rilascio 1.0 del progetto 'calc'." Committed revision 351.
This example assumes that a
/calc/tags
directory already exists. (If it
doesn't, vedi svn mkdir).
After the copy completes, the new
release-1.0
directory is forever a
snapshot of how the project looked in the
HEAD
revision at the time you made the
copy. Of course you might want to be more precise about
exactly which revision you copy, in case somebody else may
have committed changes to the project when you weren't
looking. So if you know that revision 350 of
/calc/trunk
is exactly the snapshot you
want, you can specify it by passing -r 350
to
the svn copy command.
Questo esempio presume che cartella
/calc/tags
già esiste. (Se no,
vedi svn mkdir).
Dopo che la copia è completata, la nuova cartella
release-1.0
è per sempre
un'instantanea come il progetto appariva nella versione
HEAD
in momento della copiatura.
Certo, potete forse volere di essere più precisi nello
stabilire quale versione copiare, in caso che qualcun altro
aveva depositato cambiamenti quando non avete guardato.
Sapendo che la versione 350 di
/calc/trunk
è proprio quella voluta,
potete specificarlo passando opzione -r 350
al
comando svn copy.
But wait a moment: isn't this tag-creation procedure the same procedure we used to create a branch? Yes, in fact, it is. In Subversion, there's no difference between a tag and a branch. Both are just ordinary directories that are created by copying. Just as with branches, the only reason a copied directory is a “tag” is because humans have decided to treat it that way: as long as nobody ever commits to the directory, it forever remains a snapshot. If people start committing to it, it becomes a branch.
Ma aspettate un po': la procedura di creare una targa non è la stessa come creare un ramo? Sì, infatti, lo è. In Subversion non c'è differenza tra targa e ramo. Entrambi sono ordinarie cartelle e sono creati tramite copiatura. Uguale come per i rami, l'unica ragione che una cartella copiata è una «targa» è perché esseri umani hanno deciso di trattarla in quel modo: finché nessuno fa commit su questa cartella, rimane per sempre un'instantanea. Se la gente comincia a depositare dentro (commit), diventa un ramo.
If you are administering a repository, there are two approaches you can take to managing tags. The first approach is “hands off”: as a matter of project policy, decide where your tags will live, and make sure all users know how to treat the directories they copy in there. (That is, make sure they know not to commit to them.) The second approach is more paranoid: you can use one of the access-control scripts provided with Subversion to prevent anyone from doing anything but creating new copies in the tags-area (See Capitolo 6, Configurazione del server.) The paranoid approach, however, isn't usually necessary. If a user accidentally commits a change to a tag-directory, you can simply undo the change as discussed in the previous section. This is version control, after all.
Se state amministrando un deposito(repository), ci sono due approci da prendere per maneggiare targhe. Il primo approcio è «alzare le mani»: nelle regole del progetto decidete dove vivranno le targhe e assicurate che tutti utenti capiscono come trattare le cartelle che copiano lì. (Proprio così, assicuratevi che sanno di non fare commit su di essi.[26]) Il secondo approcio è più paranoico. Potete usare uno dei script di controllo d'accesso forniti con Subversion per prevenire che nell'area delle targhe nessuno può fare altro che creare nuove copie. (Vedi Capitolo 6, Configurazione del server.) L'approcio paranoico, comunque, non è tanto necessario. Se un utente accidentalmente fa un commit nella cartella delle targhe, potete semplicemente disfare la modifica come abbiamo discuso nella sezione precedente. Oltrettuto, stiamo usando controllo delle versioni, no?
Sometimes you may want your “snapshot” to be more complicated than a single directory at a single revision.
Qualche volta potete desiderare che vostra «instantanea» sarà più complicata di una singola cartella della singola revisione.
For example, pretend your project is much larger than our
calc
example: suppose it contains a
number of subdirectories and many more files. In the course
of your work, you may decide that you need to create a working
copy that is designed to have specific features and bug fixes.
You can accomplish this by selectively backdating files or
directories to particular revisions (using svn update
-r liberally), or by switching files and directories
to particular branches (making use of svn
switch). When you're done, your working copy is a
hodgepodge of repository locations from different revisions.
But after testing, you know it's the precise combination of
data you need.
For example, pretend your project is much larger than our
calc
example: supponiamo che contiene
gran numero di sottocartelle e molto di più file. Nel corso
del vostro lavoro potete decidere che avete bisogno di creare
una copia di lavoro progettata per avere specifiche caratteristiche
e bug fix.
You can accomplish this by selectively backdating files or
directories to particular revisions (using svn update
-r liberally), or by switching files and directories
to particular branches (making use of svn
switch). Dopo aver finito, vostra copia di lavoro
è un groviglio delle locazioni del deposito(repository) dalle diverse versioni.
Ma dopo i test, sapete che questa è la precisa combinazione dei dati
che vi serve.
Time to make a snapshot. Copying one URL to another won't work here. In this case, you want to make a snapshot of your exact working copy arrangement and store it in the repository. Luckily, svn copy actually has four different uses (which you can read about in Chapter 9), including the ability to copy a working-copy tree to the repository:
Ora di scattare un'instantanea. Copying one URL to another won't work here. In this case, you want to make a snapshot of your exact working copy arrangement and store it in the repository. Luckily, svn copy actually has four different uses (which you can read about in Capitolo 9, Riferimento completo di Subversion), incluso la capacità di copiare una copia di lavoro nel deposito(repository):
$ ls my-working-copy/ $ svn copy my-working-copy http://svn.example.com/repos/calc/tags/mytag Committed revision 352.
Now there is a new directory in the repository,
/calc/tags/mytag
, which is an exact
snapshot of your working copy—mixed revisions, URLs,
and all.
Adesso nel deposito(repository) c'è una nuova cartella,
/calc/tags/mytag
, che è un'instantanea
esatta della vostra copia di lavoro—revisioni miste, URL,
e tutto il resto.
Other users have found interesting uses for this feature. Sometimes there are situations where you have a bunch of local changes made to your working copy, and you'd like a collaborator to see them. Instead of running svn diff and sending a patch file (which won't capture tree changes, symlink changes or changes in properties), you can instead use svn copy to “upload” your working copy to a private area of the repository. Your collaborator can then either checkout a verbatim copy of your working copy, or use svn merge to receive your exact changes.
Altri utenti hanno trovato usi interessanti per questa caratteristica. Di tanto in tanto sono le situazioni avete una manciata delle modifiche locali fatte sulla vostra copia di lavoro e volete farle vedere ai vostri collaboratori. Invece di usare svn diff e mandarli file patch (che non può catturare cambiamenti di cartelle, link simbolici oppure cambiamenti delle proprietà) potete usare svn copy per «caricare» la vostra copia di lavoro nella area privata del deposito(repository). Vostro collaboratore può poi o tirarsi fuori una copia identica (checkout) o usare svn merge per ricevere le vostre modifiche.