SVN (WebCie)

From A-Eskwiki
Jump to: navigation, search


We gebruiken tegenwoordig WebCie Git, dus het overgrote gedeelte van de pagina staat vanaf nu in html-comments. Check dus de source als je toch nog SVN moet leren!


Hoe verhuis ik SVN naar Git?

In december 2016 heeft de WebCie besloten om over te stappen naar Git. Omdat dit nogal een klus is en meerdere dagen duurde, leek het me handig om voor mezelf ook meteen bij te houden wat er voor stappen nodig waren. Zie ook StackOverflow en iemands website.

Maak in je homedir een mapje waar alle tsjak in terechtkomt.

mkdir ~/svn2git

Eerst zoeken we alle committers uit zodat we die naar git kunnen vertalen.

cd ~/wwwdebug
git svn rebase
git shortlog -sn > ~/svn2git/committers.txt
cd ~/svn2git

(alternatief als je nog geen gitsvn-checkout hebt, maar werkt niet want er staan HEEL ERG VEEL dingen in SVN:

svn log --quiet https://svn.a-eskwadraat.nl/svn/www/ | grep '^r' | awk '{print $3}' | sort -u > committers.txt

Vertaal nu gebruikersnamen naar naam + emailadres (het formaat is gebruikersnaam = Naam <emailadres&rt;. Gebruik bijvoorbeeld dit vim-macro: |df→yiw$a = ^[pa <^[pa@a-eskwadraat.nl>^[j (waarbij staat voor tab en ^[ voor escape)

vim authors.txt

We gaan nu een schone kopie van de repo maken om daar verscheidene vertalingen op toe te passen. Dit duurt ongelofelijk lang want er staan HEEL ERG VEEL dingen in SVN:

git svn clone https://svn.a-eskwadraat.nl/svn/www/ --no-metadata -A authors.txt -t tags -b branches -T trunk wwwdebug >>fetch_log 2>>error_log

(Merk op dat we elke branch uitchecken en het op zijn minst lineair is in het totaal aantal wijzigingen in elke commit op elke branch, wat ook wel O(griezelig groot) heet.)

Je kan nu misschien de volgende errors krijgen (hiervoor hebben we de bestanden fetch_log en error_log want een paar duizend commits keer een paar duizend files scrolt meteen uit je terminalbuffer):

  • ontbrekende author: voeg die toe in authors.txt en git svn fetch >>fetch_log 2>>error_log verder
  • ontbrekende bestanden (absent_file en/of object not found in commit): Volgens het internet: doe git svn reset -r... tot de laatste commit die wel klopte en git svn fetch >>fetch_log 2>>error_log verder. Dit bleek niet te werken bij het fetchen van r15195 naar trunk, dus toen ben ik maar een bestaande git-svn checkout gaan bewerken.

Vraag een sysopper of die heel lief voor je wil zijn en de commithooks uit de svn-repository in ~/svn2git/hooks wil zetten. Liefst ook het script dat de WebCie een mail stuurt als een nieuwe commit is gepusht, op dit moment te vinden in /usr/share/subversion/hook-scripts/mailer/mailer.py

Nu gaan we nog wat restjes ledendata weghalen, want blijkbaar was het een ding vroeger om ledendata in je repo te zetten... Zie ook StackOverflow.

git filter-branch --index-filter 'git rm --cached -r --ignore-unmatch www/whoswho_cprogs.old/' --prune-empty --tag-name-filter cat -- --all

(Check of het ook weg is in de obsolete branch, of mieter gewoon die hele branch weg!)

Importeer de commit-hooks van subversion en pas ze aan zodat ze met git werken. Ik heb besloten om ze in een nieuwe map hooks te zetten en dan te symlinken. Dit is een boel gespecialiseerd programmeerwerk, dus kan ik verder geen hints voor geven. Check wel even dat al je dingen executable zijn!

Pas in je lokale repository ook de cronscripts aan zodat ze werken met git ipv svn.

Nu gaan we dingen beschikbaar maken! Maak een repo voor alle commits en eentje voor de hooks. Op vm-www:

sudo mkdir -p /srv/git /srv/git-hooks
sudo chown webcie:webcie /srv/git /srv/git-hooks
sudo chmod o= /srv/git /srv/git-hooks
sudo chmod ug=rwx /srv/git /srv/git-hooks
sudo chmod g+s /srv/git /srv/git-hooks
cd /srv/git
git init --bare # want we willen niet dat er een checkout komt!
cd ../git-hooks
git init
git remote add origin ../git
git config core.sparsecheckout true # we hoeven alleen de hooks hier te hebben
echo hooks/ >> .git/info/sparse-checkout

In je lokale git-repo:

git remote add origin ssh://vm-www/srv/git
git push origin master

Op vm-www, in /srv/git-hooks:

git pull
cd /srv/git/hooks
ln -s /srv/git-hooks/* .

Installeer een ssh key zodat je als user webcie kan git pull'en. Op vm-www-debug als user webcie:

ssh-keygen                                                                     
ssh-copy-id vm-www     
      
# Maak nu de repo voor demosite                                                      
mkdir /srv/http/demo/git                                                       
cd /srv/http/demo/git                                                          
git init                                                                       
git remote add origin ssh://vm-www/srv/git                                     
git pull origin master                                                      

# Stop de huidige inhoud van demosite in je git-repo                              
rm -r gettext lib scripts share www                                            
mv ../gettext ../lib ../scripts ../share ../www .                              
# en gebruik symlinks om het weer werkend te krijgen                           
ln -s /srv/http/demo/git/gettext ..                                            
ln -s /srv/http/demo/git/lib ..                                                
ln -s /srv/http/demo/git/scripts ..                                            
ln -s /srv/http/demo/git/share ..                                              
ln -s /srv/http/demo/git/www ..

Check goed dat alles werkt (zie ook Bug #7334 voor een error die random was begonnen te gebeuren en random weer ophield), en doe hetzelfde voor de livesite in /srv/http/www/git (ik ga geen commando's geven want je moet hier heel goed bij nadenken!)

Ook nog wat cronjobs installeren (die je als het goed is al hebt vertaald van svn naar git!)

Op vm-www-debug als user webcie:

               
cd /srv/http/demo/scripts                                                      
crontab -l # check dat je de juiste crontab wil aanpassen                      
crontab cron/crontab_vm-www-debug.webcie                                      

Op vm-www als user webcie:

               
cd /srv/http/demo/scripts                                                      
crontab -l # check dat je de juiste crontab wil aanpassen                      
crontab cron/crontab_vm-www.webcie                                      

Zorg er tenslotte "eventjes" voor dat iedereen overstapt naar Git en alle documentatie weer klopt.