Inizio  >  Docs  >  Linux  >  How to  >  SVN  
SVNSVN

Index

Create a new SVN repository

#!/bin/bash

#echo "arguments:"$#

POSITIONAL=()
if [[ $# -gt 0 ]]
    then
    while [[ $# -gt 0 ]]
    do
    key="$1"
    case $key in
        -n|--name)
        SVNNAME="$2"
        shift # past argument
        shift # past value
        ;;
        -p|--svnpath)
        SVNPATH="$2"
        shift # past argument
        shift # past value
        ;;
        *)    # unknown option
        POSITIONAL+=("$1") # save it in an array for later
        shift # past argument
        ;;
    esac
    done
    set -- "${POSITIONAL[@]}" # restore positional parameters
   
    if [ "${SVNPATH}" == "" ]; then
        SVNPATH="svn"
    fi
   
    MAINSVNPATH="/srv/repos/"
    SVNPATH="${MAINSVNPATH}${SVNPATH}"
    echo FILE SVNNAME  = "${SVNNAME}"
    echo SEARCH PATH     = "${SVNPATH}"
   
    if [ ! -d "$SVNPATH" ]; then
      # Control will enter here if $DIRECTORY doesn't exist.
      mkdir -p "$SVNPATH"
    fi
   
   
    svnadmin create "${SVNPATH}/${SVNNAME}"
    chown -R www-data:www-data "${SVNPATH}/${SVNNAME}"
    chmod -R g+w "${SVNPATH}/${SVNNAME}"
    chmod -R g+s "${SVNPATH}/${SVNNAME}"

else
    echo 'usage: ./test.sh -n svnName -p sysOps -d "SVN Description" '
fi

automatically add to SVN all the new file in a folder

to add to SVN all the new file in /etc:

svn add `svn status /etc|grep \?|awk '{print $2}'`


recursively removing .svn folders

#!/bin/sh 
echo "recursively removing .svn folders from" 
pwd 
rm -rf `find . -type d -name .svn`
 
 

Change svn repository on all .svn/entries

grep  -l -R -i oldServer .svn *
spedition/config/sql/.svn/entries
spedition/config/.svn/entries
spedition/tests/fixtures/.svn/entries
spedition/tests/groups/.svn/entries
spedition/tests/cases/behaviors/.svn/entries
spedition/tests/cases/controllers/.svn/entries
spedition/tests/cases/helpers/.svn/entries
spedition/tests/cases/models/.svn/entries
spedition/tests/cases/components/.svn/entries
spedition/tests/cases/.svn/entries
spedition/tests/.svn/entries
spedition/controllers/components/.svn/entries
spedition/controllers/.svn/entries
spedition/views/causals/.svn/entries
spedition/views/packaging_types/.svn/entries
spedition/views/items/.svn/entries
spedition/views/pages/.svn/entries

sed -i.bak 's/oldServer/newServer/g' `grep  -l -R -i oldServer .svn *`

 

SVN Repository migration

In the old SVN server

cd /opt/projects/svn/
root@ITB-S0032:/opt/projects/svn# ll
total 1
drwxrwsr-x 19 root  www-data 1 2010-11-16 18:41 .
drwxrwsr-x  5 root  www-data 1 2011-03-07 15:09 ..
drwxrwsr-x  7 root  www-data 1 2009-04-29 17:10 amico2008
drwxrwsr-x  7 root  www-data 1 2009-02-27 15:26 calibrazione
drwxrwsr-x  7 root  www-data 1 2009-03-31 16:10 capaDCT250
drwxrwsr-x  7 root  www-data 1 2009-03-03 11:07 db_prod
drwxrwsr-x  7 root  www-data 1 2009-08-22 18:50 iphone
drwxrwsr-x  7 root  www-data 1 2009-03-29 19:48 ocaGame
drwxrwsr-x  7 root  www-data 1 2009-04-10 19:18 oldDbProd
drwxrwsr-x  7 root  www-data 1 2010-11-16 18:41 paroliamo
drwxrwsr-x  7 root  www-data 1 2009-02-27 13:52 PatchPanels
drwxrwsr-x  7 root  www-data 1 2010-11-03 16:57 presences
drwxrwsr-x  7 root  www-data 1 2010-01-19 09:14 Production2010
drwxrwsr-x  7 root  www-data 1 2009-02-23 09:06 sandbox
drwxrwsr-x  7 root  www-data 1 2009-04-01 08:42 SapRfc
drwxrwsr-x  7 root  www-data 1 2010-07-27 09:02 spedition

for svnName in `ls -1`; do svnadmin dump ${svnName} >/media/svnDump/${svnName}.dump ; done;

in the new SVN server:

for svnName in `ls -1 /media/svnDump/`; do svnadmin create /srv/www/svn/svnrepos/`basename ${svnName} .dump`; svnadmin load /srv/www/svn/svnrepos/`basename ${svnName} .dump` < /media/svnDump/${svnName}; done;

 

To top

quick svn cmds

Creare un nuovo repository:

svnadmin create /opt/svn_repo/

per popolarlo di  file esistenti:
svn import /tmp/db_prod/ file:///opt/svn_repo/db_prod -m "initial import"

per effettuare il checkout da locale (file://)
svn checkout file:///opt/svn_repo/db_prod/trunk db_prod

Per evidenziare le differenze tra repository e copia locale
svn diff

Per evidenziare le differenze tra repository e copia locale del file index.php:
svn diff db_prod/index.php

Per effettuare il commit del progetto:
svn commit db_prod

Per effettuare il commit del file index.php :
svn commit db_prod/index.php

Per aggiornare la copia locale dal repository:
svn update db_prod

Per aggoungere un nuovo file al repository:
svn add db_prod/templates/report/ReportBase.tpl

N.B. il file viene messo in coda per l'aggiunta e verrà inserita al successivo commit

Stampare lo status della copia locale:
svn status

es.:

?      db_prod/test.html
?      db_prod/templates_c/%%0E^0E4^0E407559%%footer.tpl.php
?      db_prod/templates_c/%%F7^F7F^F7F34188%%header.tpl.php
?      db_prod/templates_c/%%04^04B^04B22881%%form.tpl.php
A      db_prod/templates/report/ReportBase.tpl

? file non gestiti dal repository
A file in coda per l'aggiunta

su server s0032:

#crea il nuovo repository
svnadmin create /opt/svn-repos/GestioneCellulari
#cambio i permessi
chown -R nikoz:subversion /opt/svn-repos/GestioneCellulari/
#se voglio usare la configurazione deigli altri repository linko la cartella conf
rm -rf /opt/svn-repos/GestioneCellulari/conf
ln -sf /opt/svn-repos/conf/ /opt/svn-repos/GestioneCellulari/conf

#cancellazione ??
sudo rm -rf /opt/svn-repos/GestioneCellulari

To top

Guida rapida alla configurazione del servizio svn

http://www.squadrainformatica.com/it/blog/guida_rapida_alla_configurazione_di_svn

Svn o subversion è un SCM molto conosciuto ma a me ignoto fino a qualche giorno fa. Fino ad ora mi ero appoggiato a cvs per le mie (scarse) esigenze di revision control.
Il motivo per cui mi sono ritrovato a smanettare con svn si saprà tra un pò. Per il momento in questo post mi limito a dare delle linee guida per una rapida implementazione del servizio.

Riferimenti:

la documentazione ufficiale è estesa e ottima, non serve altro: sicuramente da leggere con pazienza e da sperimentare passo (è stata realizzata seguendo il processo top-down)

 

Ambiente:

Svn, a differenza di git (altro SCM molto in voga e rinomato per essere il sistema usato dagli sviluppatori del kernel linux), è un sistema centralizzato, quindi prevede 1 server e N client. Si potrebbero avere 2 o più server in ottica di ridondanza ma non lo considero al momento.

Uso un server debian lenny (S) e un client ubuntu hardy (C).

Idee che stanno alla base di questa guida:

  1. usare 1 repository per ogni progetto (politica discutibile, ma nel mio caso è quello che mi serve)
  2. configurare svn per essere accessibile via web senza aprire porte diverse dalla 80
  3. mantenere un controllo piuttosto stretto dei diritti di accesso ai singoli repository

Per svn esistono 2 metodi per accedere ai repository, uno via svnserve e uno mediante un modulo di apache che si appoggia sul modulo dav. Esistono poi diversi meccanismi di autenticazione. Mi concentro su apache ed uso l'autenticazione via htaccess, salto gli altri possibili metodi , anche se mi stuzzica non poco l'autenticazione contro LDAP [per la quale si può prendere spunto da qui].

 

Configurazione:

Lato server: (presuppongo un apache2 già funzionante)

apt-get install libapache2-svn subversion subversion-tools

Per i repository mi organizzo cosi: creo una directory svn che conterrà N sottodirectory, dove N è il numero di progetto ospitati (ad es. il progetto hello_world [si, la fantasia è il mio forte!]).

mkdir /svn/hello_world -p
chown www-data:www-data -fR /svn
svnadmin create /svn/hello_word

Questa è la struttura che assume il repository:

.
|-- README.txt
|-- conf
| |-- authz
| |-- passwd
| `-- svnserve.conf
|-- dav
| `-- activities.d
|-- db
| |-- current
| |-- format
| |-- fs-type
| |-- revprops
| | `-- 0
| | |-- 0
| | |-- 1
| | |-- 2
| | `-- 3
| |-- revs
| | `-- 0
| | |-- 0
| | |-- 1
| | |-- 2
| | `-- 3
| |-- transactions
| |-- txn-current
| |-- txn-current-lock
| |-- txn-protorevs
| |-- uuid
| `-- write-lock
|-- format
|-- hooks
| |-- post-commit.tmpl
| |-- post-lock.tmpl
| |-- post-revprop-change.tmpl
| |-- post-unlock.tmpl
| |-- pre-commit.tmpl
| |-- pre-lock.tmpl
| |-- pre-revprop-change.tmpl
| |-- pre-unlock.tmpl
| `-- start-commit.tmpl
`-- locks
|-- db-logs.lock
`-- db.lock

Abilito i moduli per apache2 (dovrebbero già essere abilitati ma un double check non fa mai male)

a2enmod dav dav_svn

se è necessario, riavvio apache2.

Configuro apache2 per indicare al modulo dav_svn dove si trova il repository e quali acl voglio che siano implementate:

vim /etc/apache2/apache2.conf 

in fondo al file aggiungo:

#Questo indica ad apache che quando arriva una richiesta da un client per http://hostname/svn significa che il client vuole accedere ai repository contenuti in /svn
<Location /svn>
DAV svn

#Questo indica ad apache che la directory /svn contiene più di un repository
SVNParentPath /svn

#Questo consente
SVNListParentPath on

# significa: al primo tentativo di accesso assumi che sia un accesso anonymo.
# in seconda battuta, se necessario richiedi l'autorizzazione
Satisfy Any
Require valid-user

# autenticazione utente
AuthType Basic #ATTENZIONE! usando Digest non funziona più l'autenticazione [qualcuno sa il perchè?]
  AuthName "Spippolo svn repository"  #nome del repository
  AuthUserFile /etc/svn/auth-file  #file che contiene utenti e password
  AuthzSVNAccessFile /etc/svn/authz   #file che contiene le acl per gli utenti
</Location>

#Dirotto i log legati a svn su di un file esterno a quello di apache per non sporcarlo
CustomLog /var/log/svn_logfile "%t %u %{SVN-ACTION}e" env=SVN-ACTION

aggiungo l'utente damko

mkdir /etc/svn
#uso cifratura md5
htpasswd -cm /etc/svn/auth-file dam

al prompt inserisco la password per l'utente dam

Ora che ho un utente posso configurare le acl per l'utente dam e per il progetto hello_world. Uso il modello di file fornito da svn
cp /svn/hello_world/conf/authz /etc/svn/

Edito il file delle acl e lo modifico in modo che l'utente dam abbia accesso in lettura / scritttura al repository in modo che possa effettuare i commit.

vim /etc/svn/authz
[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

# tutti hanno accesso in lettura a qualunque repository salvo eccezioni
[/]
* = r

[hello_world:/]
dam = rw
* = r

volendo potrei anche definire una politica più fine per il singolo repository: ad es. potrei inibire l'accesso in scrittura per l'utente dam alla sottodirectory branches del progetto hello_world in questo modo e impedire l'accesso, anche in lettura a tutti gli altri utenti.

[hello_world:/branches/]
dam = r
* =

riavvio apache2

apache2ctl restart


Test:

Se accedo via browser all'indirizzo http://hostname/svn mi viene chiesta username e password. Fornendo le credenziali vedo la lista dei progetti ospitati.

Se accedo via browser all'indirizzo http://hostname/svn/hello_world ho accesso anche senza credenziali

Lato client:

apt-get install libapache2-svn subversion

Questo mi consente di usare i comandi di svn, update checkout, commit ... ma questa è un'altra storia per un altro post.

To top

fix "This client is too old to work with working copy " error

http://subversion.tigris.org/faq.html#working-copy-format-change

Sometimes the working copy metadata format changes incompatibly between minor releases. For example, say you have a working copy created with Subversion 1.4.4, but one day you decide to try out Subversion 1.5.0. Afterwards, you attempt to switch back to 1.4.4, but it doesn't work — it just gives the above error.

This is because 1.5.0 upgraded your working copy format to support some new features (in this case, changelists, the keep-local flag, and variable-depth directories). Although 1.4.4 doesn't know anything about these new features, it can at least recognize that the working copy format has been upgraded to something higher than it can handle.

1.5.0 upgraded the working copy for a good reason: it realizes that 1.4.4 does not know about these new features, and that if 1.4.4 were to meddle with the working copy metadata now, important information might be lost, possibly causing corruption (see issue #2961, for example).

But this automatic upgrade behavior can be annoying, if you just want to try out a new release of Subversion without installing it permanently. For this reason, we distribute a script that can downgrade working copies when doing so is safe:

http://svn.collab.net/repos/svn/trunk/tools/client-side/change-svn-wc-format.py

Local copy HERE

Run that script with the "<tt>--help</tt>" option to see how to use it. As future versions of Subversion are released, we will try to keep this FAQ entry up-to-date with potential downgrade scenarios and their implications.

 

 

To top