Subversion
De SergiTurWiki
| Curs: | LinuxProgramacio |
| Fitxers: | ControlDeVersions.pdf |
| Repositori SVN: | http://svn.projectes.lafarga.cat/svn/iceupc/LinuxProgramacio |
| Usuari: | anonymous |
| Paraula de pas: | sense paraula de pas |
| Autors: | Sergi Tur Badenas |
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:
- Actualitzar la còpia de treball
- Realitzar canvis a la còpia de treball
- Examinar els canvis
- Desfer alguns canvis en cas si s'escau
- Resoldre conflictes
- 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 M Modificareu els fitxers amb les vostres eines preferides (editor de text, entord de desenvolupament integral, etc...), 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:
$ 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
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:
Us col·loqueu a la carpeta local on voleu "descarregar" el repositori
$ cd $ mkdir svn $ cd svn
I executeu el checkout
$ svn co files://localhost/var/lib/svn/cursplinux cursplinux
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.
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
$ svn propset svn:ignore '*' directori/
switch
TODO
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:
- http://svnbook.red-bean.com/en/1.0/ch07s03.html
- http://www.jefferyfernandez.id.au/2007/03/26/svnexternals-linking-external-libraries/
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
- http://svnbook.red-bean.com/en/1.4/svn.advanced.props.special.keywords.html
- http://blog.taragana.com/index.php/archive/how-to-add-revision-number-id-automatically-to-subversion-files-in-two-simple-steps/
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
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 independènt del protocol de transport. Alguns dels esquemes que suporta els podeu veure a la següent taula:
Instal·lació i configuració
Recursos:
- https://help.ubuntu.com/community/Subversion?action=show&redirect=SVN
- http://queens.db.toronto.edu/~nilesh/linux/subversion-howto/
Creació del repositori
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
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:
Crear un mirror d'un repositori
Consulteu:
Instal·lació
subversion-tools
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
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.
Aneu a la carpeta on esta instal·lat eclipse i descarregueu-lo:
$ cd ~/eclipse $ wget http://subclipse.tigris.org/files/documents/906/46495/site-1.6.5.zip
IMPORTANT: Consulteu a: http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA Si hi ha versions més actuals de subclipse. A data (--acacha 10:34, 21 oct 2009 (UTC)) la versió que apareix a aquesta wiki era la més actual.
Si executeu:
$ thunar site-1.6.5.zip
Veureu que són fitxer de la carpeta plugins i features d'Eclipse. Només queda descomprimir:
$ unzip site-1.6.5.zip
I consulteu la web http://subclipse.tigris.org/install.html per tal de consultar com funciona el plugin.
Vegeu també l'article sobre Eclipse.
Recursos:
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
Els comits no funcionen. Demana una paraula de pas de gnome keyring
Esborreu el fitxer:
$ rm ~/.gnome2/keyrings/login.keyring
Recursos:
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


