Este documento presenta un resumen de un curso avanzado sobre el uso de Subversion (SVN). El curso cubre conceptos básicos de SVN, merge y actualización, ramas, resolución de conflictos, externals y otros consejos. El esquema del curso incluye nociones básicas, merge avanzado, resolución de conflictos, externals y miscelánea.
1. Subversion
Uso avanzado
Bruno Gonzalez <bruno@irontec.com>
Irontec – Internet y Sistemas sobre GNU/Linux
2. Curso Avanzado SVN
1
Esquema del curso
1.Nociones básicas:
1.Svn 101
2.Estructura de un checkout
3.Estructura de un repo
2.merge y su hijo bastardo: update
3.Merge avanzado: branches
4.Arreglar los conflictos de merge/update
5.Externals
6.Miscelanea
2
4. Curso Avanzado SVN
1
Nociones Básicas: SVN 101
➢ Comandos típicos
➢ Checkout – svn co
➢ Update – svn up
➢ Commit – svn ci
➢ Status – svn st
➢ cat, blame, log… → svn help
➢ Usar siempre que se pueda:
➢ Copy – cp
➢ Move – mv
➢ URLs:
➢ Locales: ./X
➢ Remotas: http://dev2.../X
➢ Remota (rev): http://dev2.../X@R
4
5. Curso Avanzado SVN
1
Nociones Básicas: Estructura básica de un checkout
➢ Datos → ls
➢ Metadatos → ls .svn
➢ svn info *
➢ svn proplist (propedit, propdel...)
➢ Se puede mover un checkout o subdirectorio
por el disco duro sin problemas.
5
6. Curso Avanzado SVN
Nociones Básicas: Estructura básica de un
1 ➢ trunk tags branches:
repositorio
➢ Es un estandard de-facto
➢ Podemos usarlo o no, a svn le da igual
➢ Los directorios de svn tienen el significado
que nosotros le demos:
➢ trunk releases branches
➢ trunk tags branches
➢ edge released estable
➢ internal external
➢ (nada)
➢ ...
6
7. Curso Avanzado SVN
1
Merge y su hijo bastardo: update
Merge y su hijo bastardo: update
7
8. Curso Avanzado SVN
1
Merge y su hijo bastardo update: merge 101
➢ Qué es merge → DIFF + PATCH
➢ 1) Encontrar cambios en un sitio
➢ 2) Aplicar los cambios en otro sitio (by
default: “.”)
svn merge -r rev1:rev2 origen [destino]
➢ Ejemplo:
➢ svn merge -r BASE:HEAD .
➢ svn update -r HEAD
➢ svn help merge
➢ --dry-run para previsualizar sin aplicar
8
9. Curso Avanzado SVN
1
Merge y su hijo bastardo update: backports/rollbacks
➢ Qué es un backport: aplicar un bugfix/feature
de otro sitio a nuestro checkout/fichero.
svn merge -rREV-1:REV otroSitio nuestroCheckout
svn merge -c REV otroSitio nuestroCheckout
➢ Backport de varios revisiones concretas:
svn merge -c 5, 7, 10,11 otroSitio nuestroCheckout
svn merge -r 4:5 6:7 9:11 otroSitio nuestroCheckout
➢ Restaurar una version vieja:
svn merge -r BASE:X nuestroFichero nuestroCheckout
svn cp nuestroFichero@X nuestroCheckout
➢ Para evitar conflictos, no tener cambios
locales
9
11. Curso Avanzado SVN
1
Merge avanzado de branches: premisas
➢ Tipos básicos:
➢ Ramas constantes (nunca cambiarán):
➢ Tags, releases, snapshots
➢ Ramas a corto plazo (horas/días):
➢ Features, bugfixes complicados
➢ Ramas a largo plazo (infinito):
➢ Estable, trunk
➢ Antes de remezclar ramas ni mergear nada:
Eliminar/Committear siempre los
cambios locales!!
11
12. Curso Avanzado SVN
1
Merge avanzado de branches: premisas
➢ Crear una rama:
➢ svn cp trunk miRama
➢ svn cp http://.../trunk http://.../miRama
➢ Renombrar una rama:
➢ svn mv http://.../miRama http://.../foo
➢ Eliminar una rama que ya no hace falta:
➢ svn rm http://.../miRama
➢ Aún así, siempre quedarán en el historial!!
➢ Atajo: http://.../svn/proyecto/XXX == ^XXX
12
13. Curso Avanzado SVN
1
Merge avanzado de branches: ramas constantes
➢ Son lo más simple:
➢ svn cp http://.../trunk http://.../tags/XXX
➢ Lo normal es que jamás se modifiquen estas
ramas (excepto renombrar tal vez).
➢ Es típico usarlas para cada “entrega” o
checkpoint importante.
➢ Entregas:
➢ svn export http://.../tags/XXX XXX
➢ zip -r 9 XXX.zip XXX
➢ thunderbird XXX.zip (o lo que sea...)
13
14. Curso Avanzado SVN
1
Merge avanzado de branches: ramas a corto plazo
➢ Crear rama como siempre:
➢ svn cp http://.../trunk http://.../featureX
➢ Developear en esa rama:
➢ while (1): vi *.php; svn ci
➢ Ponerse al día con trunk:
➢ svn merge ^/trunk
➢ Pasar tu featureX a trunk:
➢ svn switch ^/trunk
➢ svn merge ^/featureX
➢ Eliminar rama como siempre:
➢ svn rm http://.../featureX
14
15. Curso Avanzado SVN
1
Merge avanzado de branches: ramas a largo plazo
➢ Crear rama como siempre:
➢ svn cp http://.../trunk http://.../clienteX
➢ Developear en esa rama:
➢ while (1): vi *.php; svn ci
➢ Ponerse al día con todo trunk:
➢ svn merge ^/trunk
➢ Backportear un revisiones concretas:
➢ svn merge -c 158 ^/clienteYYY
➢ svn merge -c 48,49,109 ^/clienteZZZ
15
16. Curso Avanzado SVN
1
Arreglar los conflictos de merge/update
Arreglar los conflictos de merge/update
16
17. Curso Avanzado SVN
1
Arreglar los conflictos: qué son
➢ “Mi casa es blanca”
➢ Juan: “Mi casa es negra” → svn commit
➢ Svn: OK!
➢ Enjuto: “Tu casa es blanca” → svn commit
➢ Svn: error, updatea tu version
➢ Enjuto: svn update
➢ Svn: error, hay un conflicto
SVN no sabe si debe dejarlo como juan
quiere o como enjuto quiere.
17
18. Curso Avanzado SVN
Arreglar los conflictos: cómo se identifican y
1 ➢ Aparece una 'C' en svn status
resuelven
➢ Aparecen fichero.mine, fichero.r27, etc.
➢ Svn modifica el fichero con el intento de
merge.
>>>>>>
“Mi casa es negra”
======
“Tu casa es blanca”
<<<<<<
➢ Enjuto: vi fichero→“mi casa es negra, la tuya blanca”
➢ Enjuto: svn resolved fichero
➢ Enjuto: svn commit
➢ Svn: OK!
18
19. Curso Avanzado SVN
1
Svn externals y otros consejos
svn externals y otros consejos
19
20. Curso Avanzado SVN
1
Svn externals y otros consejos
➢ Son metadatos. Permite symlinkear a
cualquier directorio de cualquier repositorio.
➢ Como crearlos:
➢ svn propedit svn:externals .
libs/karma -r1287 http://.../karma/trunk
libs/karma http://.../karma/tags/v1.5”
➢ Usar revisiones o ramas constantes siempre!
➢ Así un checkout de tu proyecto obtendra
siempre karma en el mismo estado
ahora y el año que viene.
➢ Ojo: las rutas no se actualizan solas! 20
21. Curso Avanzado SVN
1
Svn externals y otros consejos
➢ Versionar un fichero como ejecutable:
svn propset svn:executable “*” fichero
➢ Ignorar ficheros de un directorio:
➢ Svn propedit svn:ignore .
tmp.*
cache/.*jpg
Debug$
➢ Poder visualizar un diff:
apt-get install colordiff
echo 'svn diff $* |colordiff |less -R' >svndiff.sh
➢ Autonotas en mantis?
21