Curs: | LinuxProgramacio |
Fitxers: | ControlDeVersions.pdf |
Repositori SVN: | http://[email protected]/svn/iceupc/LinuxProgramacio |
Usuari: | anonymous |
Paraula de pas: | sense paraula de pas |
Autors: | Sergi Tur Badenas |
Un cop obtinguda una còpia de treball amb l'ordre checkout el cicle de treball habitual amb checkout es compon de parts:
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:
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
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
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://[email protected]/subversion/projectes/highschoolusers
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
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.
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}
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
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
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
Molt utilitzada per gestionar tags (etiquetes) i branques (branches). Normalment els repositoris SVN s'organitzen en 3 carpetes:
Per fer un nou tag de la branca principal només cal:
$ svn copy trunk/ tags/TAG_NAME
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
Crea i afegeix un directori:
$ svn mkdir prova1 A prova1
És equivalent a:
$ mkdir prova1 $ svn add prova1
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 ...
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
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
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:
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:
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:
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
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.
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 .
TODO
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:
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:
Consulteu la comanda revert
Consulteu la comanda resolve
Consulteu la comanda resolved
La configuració a nivell d'usuari la trobareu a:
~/.subversion/config
Si examineu el fitxer:
$ nano ~/.subversion/config
$ 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
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
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:
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).
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:
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
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/[email protected] http://www.iesebre.com/subversion/projectes/highschoolusers/usr/share/doc/highschoolusers/
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 independent del protocol de transport. Alguns dels esquemes que suporta els podeu veure a la següent taula:
Recursos:
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
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:
$ 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
Al fitxer svnserve.conf:
Set up svnserve.conf TODO
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:
$ 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:
$ sudo joe /var/lib/svn/conf/svnserve.conf
Cal posar:
TODO
Vegeu l'apartat següent:
Crear un mirror d'un repositori
i l'ordre svnsync.
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:
Les branques i les etiquetes es fan amb Subversion utilitzant les comandes cp i merge. El repositori s'organitza en 3 parts:
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
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:
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.
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ó.
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
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
Mediawiki:
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
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:
Consulteu:
http://en.wikipedia.org/wiki/Comparison_of_Subversion_clients
Hi ha un plugin per a Eclipse anomenat subclipse. Consulteu Subclipse.
$ sudo apt-get install nautilus-script-collection-svn
Per activar-lo cal executar:
$ nautilus-script-manager enable Subversion
I tornar a iniciar nautilus
Recursos:
$ sudo apt-get install kdesvn
$ kdesvn
$ sudo apt-get install svn-workbench
$ svn-workbench
[[]]
Recursos:
Recursos:
Recursos:
http://tortoisesvn.net
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
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
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.
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:
Consulteu:
~/.subversion/config
Busqueu "password-stores" a la secció "auth".
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
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