IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Alert.png Aquesta wiki forma part dels materials d'un curs
Curs: LinuxProgramacio
Fitxers: ControlDeVersions.pdf
Repositori SVN: http://anonymous@svn.projectes.lafarga.cat/svn/iceupc/LinuxProgramacio
Usuari: anonymous
Paraula de pas: sense paraula de pas
Autors: Sergi Tur Badenas
Logo de subversión

Contingut

Plantilla per prendre apunts

Client

Obtenir una còpia de treball amb checkout

Cicle de treball

Un cop obtinguda una còpia de treball amb l'ordre checkout el cicle de treball habitual amb checkout es compon de parts:

  1. Actualitzar la còpia de treball
  2. Realitzar canvis a la còpia de treball
  3. Examinar els canvis
  4. Desfer alguns canvis en cas si s'escau
  5. Resoldre conflictes
  6. Pujar els canvis al repositori

Les ordres que utilitzareu a cada fase són:

Actualitzar la còpia de treball

Ho farem amb l'ordre update:

$ svn update

NOTA: update s'ha d'executar dins a una carpeta que sigui una còpia de treball (una carpeta amb el directori ocult .svn)

Realitzar canvis a la còpia de treball


Modificareu els fitxers amb les vostres eines preferides (editor de text, entorn de desenvolupament integral- p.ex. Eclipse, etc...).

IMPORTANT: Recordeu que a la copia de treball heu de utilitzar les següents eines de manipulació de fitxers

$  svn add
$  svn delete
$  svn copy
$  svn move

En comptes de les ordres habituals del sistema:

$ mkdir
$ rm
$ cp
$ mv

Examinar els canvis

Tots els canvis que heu realitzat a la còpia de treball no "es guarden" al repositori fins que no realitzem un commit. Abans però podem utilitzar les ordres:

$ svn status
$ svn diff

Que us permeten respectivament, consultar els canvis que hi ha pendents de pujar al repositori i consultar les diferències que hi ha entre els fitxers modificats i els fitxers del repositori amb el format estàndard diff

Desfer alguns canvis en cas si s'escau

Podeu utilitzar l'opció revert:

$ svn revert

Per tal de eliminar algun dels canvis que hi ha pendents

Resoldre conflictes

Aquest pas es pot saltar quan es tracta d'un repositori en el qual estem treballant de form individual (no treballem en equip sobre els mateixos fitxers). Les opcions que utilitzareu són:

$  svn update
$  svn resolve

Pujar els canvis al repositori

Finalment, un cop realitzats tots els passos previs podem finalment aplicar/pujar els canvis al repositori:

$ svn commit

Recursos:

Comandes

Podeu consultar les comandes que us proporciona svn i una petita ajuda amb

$ svn help
usage: svn <subcommand> [options] [args]
Subversion command-line client, version 1.4.4.
Type 'svn help <subcommand>' for help on a specific subcommand.
Type 'svn --version' to see the program version and RA modules
  or 'svn --version --quiet' to see just the version number. 

Most subcommands take file and/or directory arguments, recursing
on the directories.  If no arguments are supplied to such a
command, it recurses on the current directory (inclusive) by default.

Available subcommands:
   add
   blame (praise, annotate, ann)
   cat
   checkout (co)
   cleanup
   commit (ci)
   copy (cp)
   delete (del, remove, rm)
   diff (di)
   export
   help (?, h)
   import
   info
   list (ls) 
   lock
   log
   merge
   mkdir
   move (mv, rename, ren)
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
   resolved
   revert
   status (stat, st)
   switch (sw)
   unlock
   update (up)  

Subversion is a tool for version control.
For additional information, see http://subversion.tigris.org/

Per consultar l'ajuda d'una subcomanda concreta podeu executar:

$ svn help add
add: Put files and directories under version control, scheduling
them for addition to repository.  They will be added in next commit.
usage: add PATH... 

Valid options:
 --targets arg            : pass contents of file ARG as additional args
 -N [--non-recursive]     : operate on single directory only
  -q [--quiet]             : print as little as possible
  --config-dir arg         : read user configuration files from directory ARG
  --force                  : force operation to run
  --no-ignore              : disregard default and svn:ignore property ignores
  --auto-props             : enable automatic properties
  --no-auto-props          : disable automatic properties

Commit (ci)

Envia els canvis de la còpia de treball local al repositori.

Exemple

$ svn ci

Podeu consultar l'ajuda amb:

$ svn help ci
commit (ci): Send changes from your working copy to the repository.
usage: commit [PATH...]

  A log message must be provided, but it can be empty.  If it is not
  given by a --message or --file option, an editor will be started.
  If any targets are (or contain) locked items, those will be
  unlocked after a successful commit.

Valid options:
  -q [--quiet]             : print as little as possible
  -N [--non-recursive]     : operate on single directory only
  --targets arg            : pass contents of file ARG as additional args
  --no-unlock              : don't unlock the targets
  -m [--message] arg       : specify log message ARG
  -F [--file] arg          : read log message from file ARG
  --force-log              : force validity of log message source
  --editor-cmd arg         : use ARG as external editor
  --encoding arg           : treat value as being in charset encoding ARG
  --username arg           : specify a username ARG
  --password arg           : specify a password ARG
  --no-auth-cache          : do not cache authentication tokens
  --non-interactive        : do no interactive prompting
  --config-dir arg         : read user configuration files from directory ARG

import

Aquesta comanda permet pujar al servidor SVN nou codi, suposeu que teniu el codi a ~/cursplinux i voleu importar el codi a un repositori SVN en local:

$ svn import -m "Missatge inicial" ~/cursplinux/test file:///var/lib/svn/cursplinux

On ~/cursplinux/test és la carpeta local on tenim el codi que volem pujar i file:///var/lib/svn/cursplinux és un servidor SVN que tenim en local.

Podem utilitzar qualsevol dels altres esquemes de connexió de subversion per pujar els fitxers amb un servidor SVN remot.

Per exemple:

$ svn import -m "Primer import dels fitxers" SVN_Cursos_ICE_UPC https://svn.projectes.lafarga.cat/svn/iceupc

Utilitzem https o un altre exemple:

$ svn import -m "Primer checkout del projecte highschoolusers..." highschoolusers http://sergi@www.iesebre.com/subversion/projectes/highschoolusers

Utilitzem HTTP (webdav)

export

Segons l'ajuda

$ svn help export
export: Create an unversioned copy of a tree.
usage: 1. export [-r REV] URL[@PEGREV] [PATH]
       2. export [-r REV] PATH1[@PEGREV] [PATH2]

 1. Exports a clean directory tree from the repository specified by
    URL, at revision REV if it is given, otherwise at HEAD, into
    PATH. If PATH is omitted, the last component of the URL is used
    for the local directory name.

 2. Exports a clean directory tree from the working copy specified by
    PATH1, at revision REV if it is given, otherwise at WORKING, into
    PATH2.  If PATH2 is omitted, the last component of the PATH1 is used
    for the local directory name. If REV is not specified, all local
    changes will be preserved.  Files not under version control will
    not be copied.

Crea una carpeta sense versionar (sense carpetes ocultes .svn) a partir d'una copia local o d'un repositori. Vegem un exemple:

$ svn export trunk ../../sourceforge/webfaltes/trunk
Export complete.
$ svn export tags ../../sourceforge/webfaltes/tags
Export complete.
$ svn export branches ../../sourceforge/webfaltes/branches
Export complete.

NOTA: No serveix per exportar un repositori a un altre repositori. Per fer això cal svnadmin

checkout

Obté una còpia de treball local d'un repositori. Anem a veure un exemple de com fer un checkout d'un repositori SVN local

Us col·loqueu a la carpeta local on voleu "descarregar" el repositori

$ cd && mkdir svn && cd svn

I executeu el checkout:

$ svn co file://localhost/var/lib/svn/cursplinux cursplinux

o

$ svn co file:////var/lib/svn/cursplinux cursplinux

NOTA: Estem suposant que prèviament s'ha creat un repositori de subversion en local. Consulteu Creació d'un repositori subversion. També estem suposant que s'ha fet un primer import d'un projecte anomenat cursplinux. Consulteu Subversion#import

NOTA: Noteu com a la URL s'utilitza el protocol file. Podeu accedir al repositori amb altres protocols, consulteu esquemes de connexió. També cal indicar que l'ordre checkout és pot utilitzar amb l'alias co com a l'exemple o amb el nom complet checkout

On:

files://localhost/var/lib/svn/cursplinux

és la URL del repositori (pot ser local com aquest cas o també remota).

i

cursplinux

el nom de la carpeta que volem que es crei al directori de treball amb els continguts del checkout.

Podem no utilitzar l'últim paràmetre i aleshores el nom de la carpeta en local serà el mateix que el nom de la carpeta en remot.

Obtenir versions diferents a HEAD (última versió)

Per exemple, per baixar la revisió x cal escriure:

$ svn co -r x http://192.168.7.100/svn_c4

és a dir, si per exemple voleu baixar la versió 15:

$ svn co -r 15 http://192.168.7.100/svn_c4

El checkout sense l'opció -r és equivalent a baixar-se l'última versió anomenada HEAD:

$ svn co -r HEAD http://192.168.7.100/svn_c4

No van amb URLs...

BASE

   The “pristine” revision of an item in a working copy.
COMMITTED

   The last revision in which an item changed before (or at) BASE.
PREV

   The revision just before the last revision in which an item changed. (Technically, COMMITTED - 1.)

TODO

També es poden especificar dates. Vegem alguns exemples:

$ svn checkout -r {2006-02-17}
$ svn checkout -r {15:30}
$ svn checkout -r {15:30:00.200000}
$ svn checkout -r {"2006-02-17 15:30"}
$ svn checkout -r {"2006-02-17 15:30 +0230"}
$ svn checkout -r {2006-02-17T15:30}
$ svn checkout -r {2006-02-17T15:30Z}
$ svn checkout -r {2006-02-17T15:30-04:00}
$ svn checkout -r {20060217T1530}
$ svn checkout -r {20060217T1530Z}
$ svn checkout -r {20060217T1530-0500}

update

La comanda update actualitza la còpia de treball, descarregant les novetats que hi hagi al repositori.

Exemple:

Obtenir la última revisió del repositori (HEAD):

$ svn update

Durant l'actualització, de cada fitxer ens mostrarà una de les següents opcions:

A  Added
D  Deleted
U  Updated
C  Conflict
G  Merged

Podeu consultar l'ajuda amb:

$ svn help update
update (up): Bring changes from the repository into the working copy.
usage: update [PATH...]

 If no revision given, bring working copy up-to-date with HEAD rev.
 Else synchronize working copy to revision given by -r.

 For each updated item a line will start with a character reporting the
 action taken.  These characters have the following meaning:

   A  Added
   D  Deleted
   U  Updated
   C  Conflict
   G  Merged

 A character in the first column signifies an update to the actual file,
 while updates to the file's properties are shown in the second column.
 A 'B' in the third column signifies that the lock for the file has
 been broken or stolen.

Valid options:
 -r [--revision] arg      : ARG (some commands also take ARG1:ARG2 range)
                            A revision argument can be one of:
                               NUMBER       revision number
                               '{' DATE '}' revision at start of the date
                               'HEAD'       latest in repository
                               'BASE'       base rev of item's working copy
                               'COMMITTED'  last commit at or before BASE
                               'PREV'       revision just before COMMITTED
 -N [--non-recursive]     : operate on single directory only
 -q [--quiet]             : print as little as possible
 --diff3-cmd arg          : use ARG as merge command
 --username arg           : specify a username ARG
 --password arg           : specify a password ARG
 --no-auth-cache          : do not cache authentication tokens
 --non-interactive        : do no interactive prompting
 --config-dir arg         : read user configuration files from directory ARG
 --ignore-externals       : ignore externals definitions

add

Afegeix un fitxer o directori al control de versions i planifica la pujada del fitxer al repositori. El fitxer serà afegit al pròxim commit.

Per exemple:

$ svn add *
svn: warning: 'TallerClausWEP' is already under version control
svn: warning: 'TaulaRodonaLinkat' is already under version control
A         XerradaOpenStreetMaps
A  (bin)  XerradaOpenStreetMaps/presentacio-ubuntujj-osm.odp

Podeu consultar l'ajuda d'aquesta comanda amb:

$ svn help add
add: Put files and directories under version control, scheduling
them for addition to repository.  They will be added in next commit.
usage: add PATH...

Valid options:
  --targets ARG            : pass contents of file ARG as additional args
  -N [--non-recursive]     : obsolete; try --depth=files or --depth=immediates
  --depth ARG              : limit operation by depth ARG ('empty', 'files',
                            'immediates', or 'infinity')
  -q [--quiet]             : print nothing, or only summary information
  --force                  : force operation to run
  --no-ignore              : disregard default and svn:ignore property ignores
  --auto-props             : enable automatic properties
  --no-auto-props          : disable automatic properties
   --parents                : add intermediate parents 

Global options:
  --username ARG           : specify a username ARG
  --password ARG           : specify a password ARG
  --no-auth-cache          : do not cache authentication tokens
  --non-interactive        : do no interactive prompting
  --config-dir ARG         : read user configuration files from directory ARG

delete

Esborra fitxers de la còpia local o del repositori.

Sinònims:

$ svn  del
$ svn remove
$ svn rm

Exemple

Esborrar un fitxer o carpeta de la còpia de treball:

$ svn rm MOodle

Per esborrar del repositori cal utilitzar la URL completa:

$ svn delete https://svn.projectes.lafarga.cat/svn/iceupc/MOodle

Podeu consultar l'ajuda amb

$ svn help rm
delete (del, remove, rm): Remove files and directories from version control.
usage: 1. delete PATH...
       2. delete URL...

 1. Each item specified by a PATH is scheduled for deletion upon
   the next commit.  Files, and directories that have not been
   committed, are immediately removed from the working copy.
   PATHs that are, or contain, unversioned or modified items will
   not be removed unless the --force option is given.

 2. Each item specified by a URL is deleted from the repository
   via an immediate commit.

Valid options:
 --force                  : force operation to run
 -q [--quiet]             : print as little as possible
 --targets arg            : pass contents of file ARG as additional args
 -m [--message] arg       : specify log message ARG
 -F [--file] arg          : read log message from file ARG
 --force-log              : force validity of log message source
 --editor-cmd arg         : use ARG as external editor
 --encoding arg           : treat value as being in charset encoding ARG
 --username arg           : specify a username ARG
 --password arg           : specify a password ARG
 --no-auth-cache          : do not cache authentication tokens
 --non-interactive        : do no interactive prompting
 --config-dir arg         : read user configuration files from directory ARG

copy

Molt utilitzada per gestionar tags (etiquetes) i branques (branches). Normalment els repositoris SVN s'organitzen en 3 carpetes:

  • trunk: Conté el cos principal del programa
  • tags: Conté versions especifiques del programa. Cada versió té una etiqueta (tag)
  • branches: Conté branques del projecte.

Per fer un nou tag de la branca principal només cal:

$ svn copy trunk/ tags/TAG_NAME

move

Permet moure o canviar el nom d'un fitxer o carpeta tant a la còpia de treball com al repositori.

Exemples

Moure un fitxer o carpeta de la còpia de treball:

$ svn move MOodle Moodle

Moure un fitxer o carpeta d'un repositori:

$ svn move https://svn.projectes.lafarga.cat/svn/iceupc/MOodle https://svn.projectes.lafarga.cat/svn/iceupc/Moodle

NOTA: Es necessiten permisos en el repositori per poder fer aquesta operació.

És equivalent a fer una còpia (copy) i després esborrar (delete).

Podeu consultar l'ajuda amb:

$ svn help move
move (mv, rename, ren): Move and/or rename something in working copy or repository.
usage: move SRC DST

 Note:  this subcommand is equivalent to a 'copy' and 'delete'.
 Note:  the --revision option has no use and is deprecated.

 SRC and DST can both be working copy (WC) paths or URLs:
   WC  -> WC:   move and schedule for addition (with history)
   URL -> URL:  complete server-side rename.

Valid options:
 -r [--revision] arg      : ARG (some commands also take ARG1:ARG2 range)
                            A revision argument can be one of:
                               NUMBER       revision number
                               '{' DATE '}' revision at start of the date
                               'HEAD'       latest in repository
                               'BASE'       base rev of item's working copy
                               'COMMITTED'  last commit at or before BASE
                               'PREV'       revision just before COMMITTED
 -q [--quiet]             : print as little as possible
 --force                  : force operation to run
 -m [--message] arg       : specify log message ARG
 -F [--file] arg          : read log message from file ARG
 --force-log              : force validity of log message source
 --editor-cmd arg         : use ARG as external editor
 --encoding arg           : treat value as being in charset encoding ARG
 --username arg           : specify a username ARG
 --password arg           : specify a password ARG
 --no-auth-cache          : do not cache authentication tokens
 --non-interactive        : do no interactive prompting
 --config-dir arg         : read user configuration files from directory ARG

mkdir

Crea i afegeix un directori:

$ svn mkdir prova1
A         prova1

És equivalent a:

$ mkdir prova1
$ svn add prova1

status

Mosta l'estat de la còpia local. Suposeu que acabeu de fer un svn rm:

$ svn rm svn-commit.*
D         svn-commit.2.tmp
D         svn-commit.3.tmp
D         svn-commit.tmp
svn: Use --force to override this restriction
svn: 'svn-commit.tmp~' is not under version control

Podeu, en qualsevol moment consultar l'estat de les vostres modificacions pendents:

$svn status
D       svn-commit.2.tmp
D       svn-commit.tmp
D       svn-commit.3.tmp

Si no us mostra cap missatge és que no teniu cap operació pendent. podeu però obligar-li a que us mostri l'estat de tots els fitxers amb verbose:


$ svn status --verbose
43       43 prova        .
43       43 prova        ealmela
43       43 prova        ealmela/tema_1
43       40 prova        amonllao
43       41 prova        jverge
43       19 prova        adomenech
...

diff

Mostra les diferències que hi ha entre els fitxers modificats a la còpia de treball i els fitxers del repositori.

$ svn diff

Amb fitxer binaris us dirà quins s'han modificat però no us podrà mostrar les diferències:

 $ svn diff
Index: ControlDeVersions.odp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: ControlDeVersions.pdf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream


Vegeu també la comanda diff

revert

En cas que un fitxer tingui un conflicte, el podrem resoldre amb la comanda revert. Amb la comanda revert, desfem (undo) tots els canvis locals, és a dir, resolem el conflicte a favor de la versió del repositori.

Un exemple:

$ svn revert README
Reverted 'README'
$ svn update README
At revision 6.

Per a revertir els canvis d'una carpeta i subcarpetes:

$ svn revert --depth infinity README

Podeu consultar l'ajuda amb:

$ svn help revert
revert: Restore pristine working copy file (undo most local edits).
usage: revert PATH...

  Note:  this subcommand does not require network access, and resolves
  any conflicted states.  However, it does not restore removed directories.

Valid options:
  --targets ARG            : pass contents of file ARG as additional args
  -R [--recursive]         : descend recursively, same as --depth=infinity
  --depth ARG              : limit operation by depth ARG ('empty', 'files',
                            'immediates', or 'infinity')
  -q [--quiet]             : print nothing, or only summary information
  --changelist ARG         : operate only on members of changelist ARG
                             [aliases: --cl]

Global options:
  --username ARG           : specify a username ARG
  --password ARG           : specify a password ARG 
  --no-auth-cache          : do not cache authentication tokens
  --non-interactive        : do no interactive prompting
  --config-dir ARG         : read user configuration files from directory ARG

merge

resolve

Consulteu la secció Resolució de conflictes, per tal d'obtenir una visió més detallada del que són els conflictes.

Si intentem pujar un fitxer al repositori amb commit o intentem obtenir la última versió d'un fitxer del repositori amb update, podem trobar un conflicte.

La pròpia comanda commit o update, ens proporcionaran la possibilitat de resoldre el conflicte, donant-los la opció de comparar els fitxers amb diff.

Si posposem la resolució del conflicte, aleshores l'haurem de resoldre posteriorment amb la comanda resolve

NOTA: El conflicte també es pot resoldre a mà editant el fitxer i posteriorment utilitzant la 
comanda resolved per desmarcar el fitxer com a conflictiu (fins que no es desmarqui el fitxer no el 
podrem pujar al repositori).

A l'hora de resoldre un conflicte hi ha 4 opcions:

  • base: S'escull com a solució el que havia abans dels nostres canvis (tant els locals com el que hi ha actualment al repositori). És a dir s'escull la versió anterior al conflicte
  • working: Si em resol els problemes a mà editant el fitxer aleshores escollim aquesta opció.
  • mine-full: S'escull la nostra versió com a solució al conflicte
  • theirs-full: S'escull la versió del repositori com a solució al conflicte.

Si feu un ls de la copia local, quan hi ha un conflicte, veureu:

$ ls  Install*
InstallDRBL.sh  
InstallDRBL.sh.mine  
InstallDRBL.sh.r38  
InstallDRBL.sh.r39

On:

  • InstallDRBL.sh: És el fitxer amb conflicte i se'l distingeix per que al seu interior hi ha línies per resoldre (marcades amb <<<<<<)
  • InstallDRBL.sh.mine: És la nostra versió
  • InstallDRBL.sh.r38: És la versió base. El que havia abans de les nostres modificacions
  • InstallDRBL.sh.mine: És la versió que hi ha ara al servidor

Podeu consultar l'ajuda d'aquesta comanda amb:

$ svn help resolve
resolve: Resolve conflicts on working copy files or directories.
usage: resolve [PATH...]

  Note:  the --accept option is currently required.

Valid options:
  --targets ARG            : pass contents of file ARG as additional args
  -R [--recursive]         : descend recursively, same as --depth=infinity
  --depth ARG              : limit operation by depth ARG ('empty', 'files',
                            'immediates', or 'infinity')
  -q [--quiet]             : print nothing, or only summary information
  --accept ARG             : specify automatic conflict resolution source
                            ('base', 'working', 'mine-full', 'theirs-full')

Global options:
  --username ARG           : specify a username ARG
  --password ARG           : specify a password ARG
  --no-auth-cache          : do not cache authentication tokens
  --non-interactive        : do no interactive prompting
  --config-dir ARG         : read user configuration files from directory ARG

Recursos:

resolved

Editem el fitxer amb el nostre editor preferit i deixem només una línia (hem d'escollir si la bona és la nostra o la del repositori).

Un cop fet això podrem pujar el fitxer amb:

$ svn resolved nomfitxer
$ svn ci nomfitxer

propset

Excloure un directori

Si s'especifica la propietat ignore podem indicar que un fitxer no ha de ser gestionat pel repositori

$ svn propset svn:ignore '*' directori/ .

IMPORTANT: No us deixeu el punt final que indica que el target és el directori actual.

Excloure un fitxer

Suposant que esteu a la carpeta on és el fitxer:

$ svn propset svn:ignore fitxer .
$ svn ci

NOTA: No oblideu el punt final ja que indica la carpeta a on està al fitxer

Es poden afegir tots els fitxers que tinguin la extensió ext amb:

$ svn propset svn:ignore *.ext .

switch

TODO

cleanup

Serveix per arreglar locks, operacions que s'han interromput inesperadament, etc.

$ svn help cleanup 
cleanup: Recursively clean up the working copy, removing locks, resuming
unfinished operations, etc.
usage: cleanup [PATH...]

Valid options:
  --diff3-cmd ARG          : use ARG as merge command  
...

Consulteu:

svnsync

svnsync

Resolució de conflictes

Al pujar (commit) o baixar (update) una nova versió d'un fitxer del repositori, hi ha la possibilitat que hi hagi un conflicte. Un conflicte succeïx quan la versió local i la versió del repositori tenen diferències en una mateixa línia.

NOTA: Si dos usuaris modifiquen al mateix temps un fitxer però en línies diferents, aleshores no hi ha conflicte. 
Subversion fa automàticament un merge (uneix les dues versions en una).

Els fitxers amb conflicte es marquen amb el caràcter C:

$ svn update
C   README

Els conflictes es marquen de la següent manera, utilitzant el format de l'eina diff:

<<<<<<< .mine
sudo cp -v drbl.conf /etc/drbl/drbl.conf
=======
sudo wget -O /etc/drbl/drbl.conf --http-user=anonymous --http-password= http://svn.projectes.lafarga.cat/svn/iescopernic/SistemaRecuperacioImatgesXarxa/drbl.conf 
>>>>>>> .r39

Aquest exemple indica el següent. Els caràcters <<<<<<< indiquen l'inici del conflicte. La línia:

sudo cp -v drbl.conf /etc/drbl/drbl.conf

És el que tenim en la còpia local (ho sabem per l'indicador .mine). La línia:

sudo wget -O /etc/drbl/drbl.conf --http-user=anonymous --http-password= http://svn.projectes.lafarga.cat/svn/iescopernic/SistemaRecuperacioImatgesXarxa/drbl.conf 

És la versió HEAD (última versió) del repositori (en aquest cas la versió 39 .r39).

Cal resoldre el conflicte escollint una de les dos línies.

Els fitxers que tenen conflictes, queden marcats i subversión ens impedeix pujar-los al repositori fins que no resolem el conflicte. Tenim tres opcions a l'hora de resoldre el conflicte:

  • Resoldre a favor de la versió del repositori amb la comanda revert

Consulteu la comanda revert

  • Utilitzar la comanda svn resolve

Consulteu la comanda resolve

  • Resoldre el conflicte editant el fitxer i utilitzant la comanda resolved

Consulteu la comanda resolved

Configuració del client

La configuració a nivell d'usuari la trobareu a:

~/.subversion/config

Si examineu el fitxer:

$ nano ~/.subversion/config

Utilitzar subversion amb un proxy

$ nano ~/.subversion/servers 
...
###   http-proxy-host            Proxy host for HTTP connection
###   http-proxy-port            Port number of proxy host service
###   http-proxy-username        Username for auth to proxy service
###   http-proxy-password        Password for auth to proxy service

Fitxers binaris

A diferència de CVS, subversion pot treballar amb fitxers binaris. Cal però tenir en compte que algunes accions no es podran dur a terme. Per exemple comparar amb l'ordre diff:

$ svn diff
Index: ControlDeVersions.odp
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: ControlDeVersions.pdf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

External definitions

Permet definir dependències, és a dir, es pot determinar que al obtenir una còpia d'un repositori (amb per exemple checkup o update) automàticament es descarregui un altre repositori.

Es pot utilitzar per exemple per a no haver de repetir fitxers en diferents repositoris o entre carpetes diferents del mateix sistema.

Per exemple, dos carpetes del mateix repositori:

http://svn.projectes.lafarga.cat/svn/iceupc/DissenyXarxaLocalLinux/moodle/sessio4/

i

http://svn.projectes.lafarga.cat/svn/iceupc/LinuxAdministracioAvan%C3%A7ada/moodle/sessio5

Resulta que volem que les dos comparteixin una mateixa carpeta, la carpeta transparències. Podem tenir els fitxers només a una de les carpetes i fer una external definition a l'altre carpeta. En el nostre cas la que conté realment els fitxers és:

http://svn.projectes.lafarga.cat/svn/iceupc/LinuxAdministracioAvan%C3%A7ada/moodle/sessio5

A l'altre, en una còpia local hem fet:

Primer crear un fitxer:

$ joe externals

Amb el següent contingut:

transparencies http://svn.projectes.lafarga.cat/svn/iceupc/LinuxAdministracioAvan%c3%a7ada/moodle/sessio5/transparencies

I hem guardat amb (Ctrl+x). Ara cal definir la propietat :

$ svn propset svn:externals -F externals .
property 'svn:externals' set on '.'
NOTA: Una alternativa és utilitzar svn propedit que obra l'editor de text per defecte i permet editar les propietats.

Ara un update tindrà el següent resultat:

$ svn update

Fetching external item into 'transparencies'
External at revision 77.

At revision 77.
NOTA: Les external definitions no apareixen a la interfície web!. 
NOTA 2: No es poden fer external definitions de fitxers. Han de ser carpetes.

IMPORTANT: Cal no oblidar fer un commit de les propietats que em modificat en local:

$ svn ci
...
--This line, and those below, will be ignored--

_M   moodle/sessio3

Sembla que la opció _M indicar que hi ha propietats modificades.

Recursos:

Properties

Permisos i propietats

TODO:

SVN does have the capability of storing metadata (properties) along with a file. The properties are basically just key/value pairs, 
however there are some special keys like the 'svn:executable', if this property exists for a file, Subversion will set the 
filesystem's executable bit for that file when checking the file out. While I know this is not exactly what you are looking for it  
might just be enough (was for me).

There are other properties for line ending (svn:eol-style) and mime type(svn:mime-type).

Keyword substitution

Es pot inserir informació dinàmica sobre subversion al codi font utilitzant la substitució de paraules clau (keyword substitution). Les paraules claus suportades són:

  • Date: La data de la última modificació. El format és 2006-07-22 21:42:37 -0700 (Sat, 22 Jul 2006). També es pot utilitzar LastChangedDate.
  • Revision: L'última versió del document.Format: $Revision: 144 $. Es pot utilitzar LastChangedRevision o Rev.
  • Author: L'últim usuari en modificar el fitxer. Format: $Author: harry $. També pot utilitzar-se LastChangedBy.
  • HeadURL: La URL completa del fitxer al repositori de versions. Format: $HeadURL: http://svn.collab.net/repos/trunk/README $. Es pot utilitzar URL.
  • Id: És un resum de totes les anteriors Format: File was last changed in revision 148 on the evening of July 28, 2006 by the user sally.

Per exemple si inseriu el següent codi al fitxer exemple.txt:

/**
* Subversion info
* Revision: $Rev$
* Date: $Date$
* Author: $Author$
* HeadURL: $HeadURL$
*/

NOTA: Podeu crear una plantilla d'Eclipse però tingueu en compte que cal "escapar" els dol·lars posant-los dos cops seguits

I indiqueu la propietat adequada (ho podeu fer amb Eclipse al menú Team--> Set Propierty):

$ svn propset svn:keywords "Rev Date Author HeadURL" exemple.txt
property 'svn:keywords' set on 'exemple.txt'

Al pròxim commit se substituirà per:

El resultat és:

/**
* Subversion info
* Revision: $Rev: 61 $
* Date: $Date: 2010-02-15 14:51:20 +0100 (dl, 15 feb 2010) $
* Author: $Author: acacha $
* HeadURL: $HeadURL: https://svn.projectes.lafarga.cat/svn/webfaltes/trunk/funcions.php $
*/

NOTA: Aquesta funcionalitat és similar a la funcionalitat anàloga de CVS

Exemples

Recuperar un fitxer esborrat

Primer cal obtenir el número de versió on el fitxer encara existia:

$ svn log -v | more
------------------------------------------------------------------------
r1746 | sergi | 2011-06-09 12:33:35 +0200 (dj, 09 jun 2011) | 1 line
Changed paths:
   A /projectes/highschoolusers/usr/share/doc/highschoolusers
   A /projectes/highschoolusers/usr/share/doc/highschoolusers/README (from /projectes/highschoolusers/usr/share/docs/highschoolusers/README:1741)
   A /projectes/highschoolusers/usr/share/doc/highschoolusers/TODO (from /projectes/highschoolusers/usr/share/docs/highschoolusers/TODO:1741) 
  

------------------------------------------------------------------------
r1745 | sergi | 2011-06-09 12:33:01 +0200 (dj, 09 jun 2011) | 1 line
Changed paths:
   A /projectes/highschoolusers/usr/share/doc
 

------------------------------------------------------------------------
r1744 | sergi | 2011-06-09 12:24:25 +0200 (dj, 09 jun 2011) | 1 line
Changed paths:
   A /projectes/highschoolusers/.buildpath
   A /projectes/highschoolusers/.project
   A /projectes/highschoolusers/.settings
   A /projectes/highschoolusers/.settings/org.eclipse.php.core.prefs
   M /projectes/highschoolusers/Makefile
   M /projectes/highschoolusers/add_plugin.php
   A /projectes/highschoolusers/usr/share/docs/highschoolusers/ldap_schemas
   A /projectes/highschoolusers/usr/share/docs/highschoolusers/ldap_schemas/highschooluser.schema

En aquest cas volem recuperar la carpeta en negreta:

/projectes/highschoolusers/usr/share/docs/highschoolusers/ldap_schemas

Finalment es pot recuperar amb un copy:

$ svn copy http://www.iesebre.com/subversion/projectes/highschoolusers/usr/share/docs/highschoolusers/ldap_schemas@1745 http://www.iesebre.com/subversion/projectes/highschoolusers/usr/share/doc/highschoolusers/

Servidor

Esquemes de connexió

Un dels avantatges de subversion és la seva arquitectura. Subversion és independent del mètode/protocol d'accés al repositori i per tant ens permet accedir-hi de múltiples maneres

Ch01dia1.png

L'esquema d'accés utilitzat és basa en URL i per tant està força estandarditzat.

Subversion utilitza un sistema d'accés al repositori basat en URL i per tant està força estandarditzat i és independent del protocol de transport. Alguns dels esquemes que suporta els podeu veure a la següent taula:

ProtocolsSVN.jpg

Instal·lació i configuració

Recursos:

Creació del repositori

Primer cal instal·lar subversion:

$ sudo apt-get install subversion

Creem la carpeta on guardarem el repositori de SVN:

$ sudo mkdir /var/lib/svn

Iniciem el repositori amb la comanda svnadmin:

$ sudo svnadmin create /var/lib/svn

Imagineu que voleu donar accés al repositori als usuaris del grup cursplinux:

Creeu el grup:

$ sudo groupadd cursplinux

Us afegiu al grup (en aquest cas l'exemple és l'usuari sergi)

$ sudo usermod -a -G cursplinux sergi

Modifiquem els permisos del repositori:

$ sudo chown -R www-data:cursplinux /var/lib/svn
$ sudo chmod -R 775 /var/lib/svn

Configuració WebDAV

NOTA: Prèviament cal haver creat el repositori amb svnadmin create

Suposem que el repositori està a:

/var/lib/svn

Cal que poseu permisos per tal que hi pugui accedir Apache:

$ sudo chown www-data:www-data -R /var/lib/svn
$ sudo chmod 770 -R /var/lib/svn

... Instal·lar el paquet:

$ sudo apt-get install libapache2-svn

... i activar els mòduls d'Apache:

$ sudo a2enmod dav
$ sudo a2enmod dav_svn

NOTA: Segons la versió, pot ser que ja tingueu activats els mòduls! consulteu el final de l'execució de l'ordre apt-get install

Ara cal configurar el fitxer /etc/apache2/mods-available/dav_svn.conf:

$ sudo joe /etc/apache2/mods-available/dav_svn.conf
<Location /svn>
  DAV svn
  SVNPath /var/lib/svn  
  AuthType Basic
  AuthName "Subversion Repository"
  AuthUserFile /etc/apache2/dav_svn.passwd
  Require valid-user
  SSLRequireSSL
</Location>

Amb accés anònim cal afegir les línies:

# try anonymous access first, resort to real
# authentication if necessary.
Satisfy Any
Require valid-user

El fitxer quedarà doncs de la següent manera:

<Location /svn>
 DAV svn
 SVNPath /var/lib/svn
 AuthType Basic
 AuthName "Subversion Repository"
 AuthUserFile /etc/apache2/dav_svn.passwd
 # try anonymous access first, resort to real
 # authentication if necessary.
 Satisfy Any
 Require valid-user
 SSLRequireSSL
</Location>


NOTA: IMPORTANT! Observeu que la configuració del lloc és fa directament al fitxer del mòdul! i no la trobareu pas a sites-available ni a conf.d!

Tingueu en compte que heu de posar els valors que s'escaiguin a la vostra configuració.

Ara cal afegir suport per a SSL al servidor. Podeu consultar l'article Configuració SSL.

Ara creem el fitxer de paraules de pas:

$ sudo htpasswd -c /etc/apache2/dav_svn.passwd sergi

Podeu afegir altres usuaris amb:

$ sudo htpasswd /etc/apache2/dav_svn.passwd john
$ sudo htpasswd /etc/apache2/dav_svn.passwd sten

Un cop ho tingueu tot torneu a iniciar Apache:

$ sudo /etc/init.d/apache2 force-reload

El repositori és accessible via SSL:

https://acacha.org/svn

Recursos:

Creació d'un repositori privat

$ sudo mkdir /var/lib/private_svn
$ sudo svnadmin create /var/lib/private_svn
$ sudo chown -R www-data:www-data /var/lib/private_svn
$ sudo chmod -R 775 /var/lib/private_svn
$ sudo apt-get install libapache2-svn
$ sudo a2enmod dav
$ sudo a2enmod dav_svn
$ sudo /etc/init.d/apache2 reload
$ sudo joe /etc/apache2/mods-available/dav_svn.conf

NOTA: A aquest últim fitxer podeu configurar tants repositoris de SVN com vulgueu. Si ja existeix un repositori públic podeu posar el privat tot seguit:

#Repositori existent
<Location /subversion>
 DAV svn
 SVNPath /var/lib/svn

 # how to authenticate a user
 AuthType Basic
 AuthName "Repositori de subversion"
 AuthUserFile /var/lib/svn/conf/htpasswords

 # our access control policy
 AuthzSVNAccessFile /var/lib/svn/conf/authz 

 # try anonymous access first, resort to real
 # authentication if necessary.
 Satisfy Any
 Require valid-user
</Location>
#Línies a afegir per al repositori privat
<Location /private_svn>
 DAV svn
 SVNPath /var/lib/private_svn

 # how to authenticate a user
 AuthType Basic
 AuthName "Repositori privat de subversion"
 AuthUserFile /var/lib/private_svn/conf/htpasswords

 # our access control policy
 AuthzSVNAccessFile /var/lib/private_svn/conf/authz

 # try anonymous access first, resort to real
 # authentication if necessary.
 Satisfy Any
 Require valid-user
</Location>

Ara cal crear el fitxer de paraules de pas:

$ sudo htpasswd -c /var/lib/private_svn/conf/htpasswords sergi

Podeu afegir altres usuaris:

$ sudo htpasswd /var/lib/private_svn/conf/htpasswords john
$ sudo htpasswd /var/lib/private_svn/conf/htpasswords sten

Un cop ho tingueu tot torneu a iniciar Apache:

$ sudo /etc/init.d/apache2 force-reload

Configuració SSH

Al fitxer svnserve.conf:

Set up svnserve.conf TODO

Configuració del servidor: svnserve.conf

El fitxer el trobareu a:

/path/to/repos/myrepo/conf/svnserve.conf

Normalment:

/var/lib/svn/conf/svnserve.conf

Si editeu el fitxer:

$ sudo joe /var/lib/svn/conf/svnserve.conf

podeu utilitzar grep per tal de veure només les línies que no són comentaris:

$ cat /var/lib/svn/conf/svnserve.conf | grep -v '#'

Un exemple:

[general]
 anon-access=none
 auth-access=write
 password-db=passwd
 authz-db=authz
 realm=My Repository

La configuració de més amunt vol dir:

  • Sense accés anònim
  • Els usuaris autoritzats tenen accés de lectura/escriptura
  • Utilitzar el fitxer passwd
  • Utilitzar el fitxer authz
  • Donar un nom al reialme

passwd

authz

mod_authz_svn

$ locate mod_authz_svn.so
/usr/lib/apache2/modules/mod_authz_svn.so

El mòdul es proporcionat per libapache2-svn:

$ dpkg -S /usr/lib/apache2/modules/mod_authz_svn.so

S'activa el mòdul amb:

$ sudo a2enmod dav_svn
Considering dependency dav for dav_svn:
Module dav already enabled
Module dav_svn already enabled

Que segurament ja el teniu activat (ho fa durant la instal·lació de libapache2-svn).

Per configurar un accés via HTTP anònim i amb usuaris:

$ sudo joe /etc/apache2/mods-enabled/dav_svn.conf

Afegiu al final del fitxer:

<Location /subversion>
 DAV svn
 SVNPath /var/lib/svn  
           
 # our access control policy
 AuthzSVNAccessFile /var/lib/svn/conf/authz                 
           
 # try anonymous access first, resort to real 
 # authentication if necessary.
 Satisfy Any
 Require valid-user
           
 # how to authenticate a user
 AuthType Basic
 AuthName "Repositori de subversion"
 AuthUserFile /var/lib/svn/conf/htpasswords                   
</Location> 

Ara falta configurar el fitxer . Un exemple amb usuari administrador i la resta d'usuaris en només lectura:

### This file is an example authorization file for svnserve.
### Its format is identical to that of mod_authz_svn authorization
### files.
### As shown below each section defines authorizations for the path and
### (optional) repository specified by the section name.
### The authorizations follow. An authorization line can refer to:
###  - a single user,
###  - a group of users defined in a special [groups] section,
###  - an alias defined in a special [aliases] section,
###  - all authenticated users, using the '$authenticated' token,
###  - only anonymous users, using the '$anonymous' token,
###  - anyone, using the '*' wildcard.
###
### A match can be inverted by prefixing the rule with '~'. Rules can
### grant read ('r') access, read-write ('rw') access, or no access
### ().

 [aliases]
# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average

[groups]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe
segondai = ealmela,jcid,ccristoful,adomenech,pgomez,igomez,amestre,amonllao,jramirez,jverge,msebastia
administrators = sergi

# [/foo/bar]
# harry = rw
# &joe = r
# * =

# [repository:/baz/fuz]
# @harry_and_sally = rw
# * = r 
 
# Allow everyone read on the entire repository
[/]  
* = r
# Allow devs with blanket commit to write to the entire repository
@administrators = rw

[/segondai]
@segondai = rw


Recursos:

authz-file

 $ sudo joe /var/lib/svn/conf/svnserve.conf

Cal posar:

svnadmin

TODO

Migrar un repositori

Vegeu l'apartat següent:

Crear un mirror d'un repositori

i l'ordre svnsync.

Crear un mirror d'un repositori

How do I download my Subversion history?

To download the history of your Google Code repository, use the svnsync tool that ships with Subversion 1.4 or later. Run 'svnsync help' to read more about this tool. Note that your local repository must have an executable 'pre-revprop-change' hook script which allows revprop changes (or at least those of the form 'svnsync*'.) Here's a sample transcript that demonstrates how you can pull history from your Google Code repository to a local repository:

 $ svnadmin create localrepos
 $ emacs localrepos/hooks/pre-revprop-change # make it 'exit 0'
 $ chmod +x localrepos/hooks/pre-revprop-change
 $ svnsync init --username USERNAME file:///path/to/localrepos https://myproject.googlecode.com/svn
 Copied properties for revision 0.
 $ svnsync sync --username USERNAME file:///path/to/localrepos
 Committed revision 1.
 Copied properties for revision 1.
 Committed revision 2.
 Copied properties for revision 2.
 [...]

After you've done this once, you can continue to run the last 'svnsync sync' command to periodically pull down the latest commits and keep your local mirror up-to-date.

Exemple de com vaig obtenir un mirror local del meu propi repositori:

$ sudo apt-get install subversion
$ cd /home/sergi/SVN/SVN_ICE
$ svnadmin create iceupc
$ joe iceupc/hooks/pre-revprop-change

Poseu:

#!/bin/sh
exit 0

I ara:

$ chmod +x iceupc/hooks/pre-revprop-change

Inicieu la sincronització:

$ svnsync init --username prova file:////home/sergi/SVN/SVN_ICE/iceupc https://svn.projectes.lafarga.cat/svn/iceupc

I podeu posar la al dia en qualsevol moment amb:

$ svnsync sync --username prova file:////home/sergi/SVN/SVN_ICE/iceupc

Consulteu:

Fent branques i etiquetes del repositori (Branching & Tagging)

Les branques i les etiquetes es fan amb Subversion utilitzant les comandes cp i merge. El repositori s'organitza en 3 parts:

  • trunk: Conté la última versió i totes les seves anteriors revisions del "tronc principal" de desenvolupament.
  • tags: Conté les diferents "fotos" del codi font en diferents moments. Cada "foto" té la seva pròpia etiqueta. Per exemple una etiqueta pot ser versió 1.1
  • branches: Conté les branques del projecte.

Aquesta organització no és automàtica, la de fer el desenvolupador creant aquestes carpetes. Les carpetes es poden dir d'un altre forma sempre i quan es tinguin en compte aquest nous noms a l'hora d'utilitzar les comandes copy i merge.

Consulteu el manual de subversion:

http://svnbook.red-bean.com/en/1.5/svn.branchmerge.html

Establint el tag Id

Anem a establir una etiqueta $Id als fitxers del projecte. El resultat serà similar a:

$Id: test.php 110 2009-04-28 05:20:41Z dordal $

És molt útil per dues raons:

  • Permet conèixer la revisió del fitxer amb la que estem treballant i qui ha sigut l'últim que hi ha treballat.
  • Si exportem el codi, permet que altres sàpiguen quina revisió tenen

Per defecte, subversion no afegeix aquest tag, per tant cal que el configurem per a fer-ho.

Per fer-ho, cal que assignem una propietat als fitxers per a que reconeguen aquesta tag. Ho podem fer de dues formes.

IMPORTANT: Aquesta configuració no es pot fer a nivell de servidor, per tant l'ha de fer cada client.

Configurar subversion per a afegir la propietat automàticament

Això afegirà automàticament la propietat svn:keywords a cada fitxer que creem de nou.

En primer lloc, cal modificar el fitxer:

~/.subversion/config

Afegir-li:

[miscellany]
enable-auto-props = yes

[auto-props]
*.php = svn:keywords=Id
*.js = svn:keywords=Id

NOTA: Les dues últimes línies indiquen en quin tipus de fitxer volem assignar la tag. Si volem assignar-li a algun fitxer diferent cal indicar la extensió.

Afegir la propietat en fitxers individuals

Això afegirà la propietat svn:keywords a una llista de fitxers ja existent. Cal fer-ho manualment.

En primer lloc cal anar a l'arrel del nostre projecte, per exemple:

~/workspace/projecte/

A continuació, executem la següent ordre:

find . \( -name "*.php" -o -name "*.js" \) -exec svn propset svn:keywords Id {} \;

NOTA: Si volem assignar-li a algun fitxer diferent cal indicar la o les extensions.

Així assignarem la propietat a una llista de fitxers que buscarà l'ordre find. Si volem assignar-li a un sol fitxer, executarem la següent:

svn propset svn:keywords Id nom_del_fitxer

Us de la tag a cada fitxer

Anteriorment hem assignat la propietat en els fitxers, ara ja queda afegir la etiqueta al fitxer.

Només cal afegir la següent línia a cada fitxer:

$Id$

Quan fem el CI del fitxer, quedarà així:

$Id: test.php 110 2009-04-28 05:20:41Z dordal $


Font

Exemples de projectes

Mediawiki:

Visualitzador web d'un repositori. ViewVC

Es pot instal·lar des del repositoris amb:

$ sudo apt-get install viewvc

els fitxers instal·lats són:

Executables:

$ dpkg -L viewvc | grep bin
/usr/lib/viewvc/vclib/bincvs
/usr/lib/viewvc/vclib/bincvs/__init__.py
/usr/lib/cgi-bin
/usr/lib/cgi-bin/viewvc.cgi

Fitxers de configuració:

$ dpkg -L viewvc | grep etc
/etc
/etc/viewvc
/etc/viewvc/templates
/etc/viewvc/templates/annotate.ezt
/etc/viewvc/templates/diff.ezt
/etc/viewvc/templates/dir_new.ezt
/etc/viewvc/templates/directory.ezt
/etc/viewvc/templates/error.ezt
/etc/viewvc/templates/graph.ezt
/etc/viewvc/templates/include
/etc/viewvc/templates/include/diff_form.ezt
/etc/viewvc/templates/include/dir_footer.ezt
/etc/viewvc/templates/include/dir_header.ezt
/etc/viewvc/templates/include/file_header.ezt
/etc/viewvc/templates/include/footer.ezt
/etc/viewvc/templates/include/header.ezt
/etc/viewvc/templates/include/log_footer.ezt
/etc/viewvc/templates/include/log_header.ezt
/etc/viewvc/templates/include/paging.ezt
/etc/viewvc/templates/include/pathrev_form.ezt
/etc/viewvc/templates/include/sort.ezt
/etc/viewvc/templates/log.ezt
/etc/viewvc/templates/log_table.ezt
/etc/viewvc/templates/markup.ezt
/etc/viewvc/templates/query.ezt
/etc/viewvc/templates/query_form.ezt
/etc/viewvc/templates/query_results.ezt
/etc/viewvc/templates/revision.ezt
/etc/viewvc/templates/roots.ezt
/etc/viewvc/templates/rss.ezt
/etc/viewvc/cvsgraph.conf
/etc/viewvc/viewvc.conf
/etc/viewvc/templates/docroot

Configuració a Ubuntu (Server)

Creeu un fitxer de configuració d'Apache:

$ sudo joe /etc/apache2/conf.d/viewvc.conf

I afegiu:

ScriptAlias /viewvc /usr/lib/cgi-bin/viewvc.cgi

torneu a iniciar Apache amb:

$ sudo /etc/init.d/apaches2 restart

Ara configureu viewvc amb:

$ sudo joe /etc/viewvc/viewvc.conf

Busqueu el text:

root_parents

I poseu el path del vostre repositori de subversion:

root_parents = /var/lib/svn

Activeu el highlight amb:

use_highlight = 1

Busqueu la línia:

cvs_roots = cvs: /home/cvsroot

I comenteu-la.

Recursos:

Eines gràfiques i IDE

Consulteu:

http://en.wikipedia.org/wiki/Comparison_of_Subversion_clients

Eclipse

Hi ha un plugin per a Eclipse anomenat subclipse. Consulteu Subclipse.

Nautilus

$ sudo apt-get install nautilus-script-collection-svn

Per activar-lo cal executar:

$ nautilus-script-manager enable Subversion

I tornar a iniciar nautilus

Recursos:

kdesvn

$ sudo apt-get install kdesvn
$ kdesvn

Pysvn

$ sudo apt-get install svn-workbench
$ svn-workbench

[[]]


Recursos:

Argonaut SVN

Recursos:

Websvn

Recursos:

Tortoise SVN (Per a Windows)

http://tortoisesvn.net

Resolució de problemes. Troubleshooting

svn: Commit failed ... Item XXX is out of date

Si us dona un error similar a:

$ svn ci -m "" tags
Deleting       tags/ubuntucustom-0.1
svn: Commit failed (details follow):
svn: Item '/projectes/ubuntucustom/tags/ubuntucustom-0.1' is out of date
make: *** [svndeletecurrentversion] Error 1

El que cal fer es resoldre el conflicte:

$ svn resolve --accept working tags

Attempted to lock an already-locked dir

Cal utilitzar l'ordre cleanup.

En el meu cas encara tenia un altre error:

org.tigris.subversion.javahl.ClientException: Problem on first log entry in a working copy
svn: In directory '/home/sergi/workspaces/php/webfaltes_sourceforge/smarty'
svn: Error processing command 'delete-entry' in '/home/sergi/workspaces/php/webfaltes_sourceforge/smarty'
Working copy not locked; this is probably a bug, please report
svn: Unable to lock '/home/sergi/workspaces/php/webfaltes_sourceforge/smarty/templates_c'

Podeu desbloquejar els locks a mà. Consulteu: svn: Working copy '.' locked


svn: Working copy '.' locked

Cada carpeta de la còpia de treball conté una carpeta oculta .svn amb la (meta)informació de subversion. Si en aquesta carpeta trobeu un fitxer buit anomenat lock, és que la carpeta està sent utilitzada en alguna operació de subversion. Si la operació finalitza inesperadament aleshores la carpeta es pot quedar bloquejada. Per desbloquejar el millor és utilitzar l'ordre cleanup, però si no funciona es pot eliminar directament aquest fitxer si esteu segurs que ninguna operació està utilitzant la carpeta.

Els comits no funcionen. Demana una paraula de pas de gnome keyring

Esborreu el fitxer:

$ rm ~/.gnome2/keyrings/login.keyring

També podeu provar:

In order to prevent SVN from asking you for 'login' keyring password you may try to add the following line to [auth] section in  
~/.subversion/config :
password-stores =

Recursos:

"Password for 'default' GNOME keyring:" o "Password for 'predeterminat'

Consulteu:

~/.subversion/config

Busqueu "password-stores" a la secció "auth".

XXXX is scheduled for addition, but is missing

Si intenteu fer un commit i us dona el següent error:

$ svn ci *
svn: Commit failed (details follow):
svn: '/home/sergi/tmp/iescopernic/FestaUbuntu/XerradaOpenStreetMaps/.~lock.presentacio-ubuntujj-osm.pdf#' is scheduled for  
addition, but is missing

Això vol dir que vau afegir un fitxer amb la comanda svn add i que ara aquest fitxer no existeix. Utilitzeu la comanda svn remove per solucionar aquest problema. Per exemple:

$ svn rm XerradaOpenStreetMaps/.~lock.presentacio-ubuntujj-osm.pdf

Si el fitxer ja no existeix el podeu crear amb touch:

$ touch XerradaOpenStreetMaps/.~lock.presentacio-ubuntujj-osm.pdf

i forçar la eliminació:

$ svn rm --force XerradaOpenStreetMaps/.~lock.presentacio-ubuntujj-osm.pdf

Aborting commit: 'PATH_TO_FILE' remains in conflict

Si al fer un commit us trobeu amb l'error:

$ svn ci *
svn: Commit failed (details follow):
svn: Aborting commit: '/home/sergi/tmp/iescopernic/SistemaRecuperacioImatgesXarxa/InstallDRBL.sh' remains in conflict

Si ja heu solucionat el conflicte podeu utilitzar

Vegeu també

Enllaços externs