Convertire un repository Svn in Git

From RVM Wiki
Revision as of 16:15, 2 November 2011 by Gabriele.vivinetto (talk | contribs) (Con git-svn-migrate)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Manualmente

Script per convertire i repository di etc/

  • Assicurarsi che il repository SVN sia in
/files/svn/repositories/REPONAME
  • Assicurarsi che il percorso del repository sia
file:///files/svn/repositories/etc/REPONAME
#!/bin/bash
if [ -z "$1" ]
then
        echo "Usage: converti reponame"
        exit 1
fi

REPO=$1
sudo apt-get install git-core git-svn
sudo mkdir -p /files/git/repos/${REPO}
cd /files/git/repos/${REPO}
sudo chmod 750 /files/git/repos/${REPO}
sudo chown -R :www-data /files/git/
sudo git init --bare
echo "/${REPO} $(hostname -f) Git Repository" | sudo tee description > /dev/null
cd /tmp/
sudo rm -rf svn
mkdir svn
cd svn
sudo svn co file:///files/svn/repositories/${REPO} .
sudo svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt
vi authors-transform.txt
sudo rm -rf /tmp/git
sudo mkdir /tmp/git
cd /tmp/git
sudo git svn clone file:///files/svn/repositories/${REPO} --no-metadata -A ../svn/authors-transform.txt .
sudo git svn show-ignore | sudo tee  .gitignore
sudo git add .gitignore

sudo git config --global user.name "Root $(hostname)"
sudo git config --global user.email root@$(hostname -f)
git config --global user.name "Gabriele Vivinetto"
git config --global user.email gabriele.vivinetto@rvmgroup.it

sudo git commit -m 'Convert svn:ignore properties to .gitignore.'
sudo git remote add ${REPO} /files/git/repos/${REPO}
sudo git config remote.${REPO}.push 'refs/remotes/*:refs/heads/*'
sudo git push ${REPO}
sudo chmod a+rX /files/git/repos/${REPO}
cd /files/git/repos/${REPO}
sudo git symbolic-ref HEAD refs/heads/git-svn
sudo git branch -m git-svn master
cd /tmp/
sudo rm -rf /tmp/${REPO}
sudo mkdir ${REPO}
cd ${REPO}/
sudo git clone /files/git/repos/${REPO} .
if [ -d trunk ]
then
        sudo git mv trunk/* .
        sudo git mv trunk/.pwd.lock .
        sudo git mv trunk/.serial.conf.old .
        sudo git commit -a -m "* removed trunk"
fi
sudo chmod -R o= /files/git/repos/${REPO}
sudo chown -R root:www-data /files/git/repos/${REPO}
sudo git push
  • Convertire la working copy attuale ATTENZIONE, CONTROLLARE !!!!:
ATTENZIONE, CONTROLLARE !!!!
ATTENZIONE, CONTROLLARE !!!!
#!/bin/bash
if [ -z "$1" ]
then
        echo "Usage: converti reponame wcopyprepath (the dir up to the working copy"
        exit 1
fi

 if [ -z "$2" ]
then
        echo "Usage: converti reponame wcopyprepath (the dir up to the working copy"
        exit 1
fi


REPO=$1
WCPATH=$2
cd ${WCPATH}
sudo tar chvf /files/${REPO}.tar ${REPO}/
cd /${WCPATH}/${REPO}
sudo rm -rf $(sudo find . -name \.svn)
sudo mv /tmp/${REPO}/.git .
sudo mv /tmp/${REPO}/.gitignore .
sudo git status
sudo git add .
sudo git commit -a -m "First git commit"
sudo git push


  • Pulire la etc:
yes '' | sudo update-alternatives --force --all > /dev/null ; sudo git commit -a -m "Removed broken links in alternatives/"
sudo git rm $(sudo find . -name \*\.dpkg-\*); sudo git commit -a -m "Removed *.dpkg-*"
sudo git rm $(sudo find . -name \*\.ucf-\*);  sudo git commit -a -m "Removed *.ucf-*"
sudo git rm .pwd.lock
sudo git rm *.drbl*
sudo git rm *.old
sudo git rm *.org
sudo git rm discover.conf-2.6
sudo git rm discover-v1.conf
sudo git rm discover.conf-2.6
sudo git commit -a -m "Removed unused files"
sudo git rm $(sudo find . -name \*\.old\*);  sudo git commit -a -m "Removed *.old*"
sudo git push

Procedura in dettaglio

  • Installare il convertitore git-svn
sudo apt-get install git-core git-svn
  • Fare il commit del repository
cd /etc
sudo ~/bin/svnaddmissing
sudo ~/bin/svndelmissing
sudo svn ci -m "* Last svn commit."
  • Creare il repo git vuoto ed inizializzarlo
sudo mkdir -p /files/git/repos/etc
cd /files/git/repos/etc
sudo chmod 750 /files/git/repos/etc
sudo chown -R :www-data /files/git/
sudo git init --bare
  • Fare il checkout del repository svn per estrarre gli autori
cd /tmp/
mkdir svn
cd svn
sudo svn co file:///files/svn/repositories/etc .
  • Verificare che abbia la struttura standard trunk/ branches/ tags
  • Estrarre gli autori
sudo svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt
  • Editare nomi ed email
vi authors-transform.txt
root = Root Fireman <root@fireman.mannesmann.priv>
  • Convertire il repository CHE DEVE AVERE IL LAYOUT STANDARD trunk/ tags/ branches/ SENZA CHE CI SIA STATA LA CONVERSIONE DA UN ALTRO FORMATO. Si perderanno tutti i commit precedenti alla formalizzazioen della struttura standard
sudo mkdir /tmp/git
cd /tmp/git
  • Per standard layout
sudo git svn clone file:///files/svn/repositories/etc --no-metadata -A ../svn/authors-transform.txt --stdlayout .
  • Se invece il repository ha un solo folder principale:
sudo git svn clone file:///files/svn/repositories/etc --no-metadata -A ../svn/authors-transform.txt .
  • Convertire gli ignore per standard layout
sudo git svn show-ignore -i trunk | sudo tee  .gitignore
  • Convertire gli ignore per NON standard layout
sudo git svn show-ignore | sudo tee  .gitignore
  • Aggiungere il file .gitignore
sudo git add .gitignore
sudo git commit -m 'Convert svn:ignore properties to .gitignore.'
  • Linkare il repository locale a quello remoto:
sudo git remote add etc /files/git/repos/etc
  • Tweak per i percorsi svn
sudo git config remote.etc.push 'refs/remotes/*:refs/heads/*'
  • Fare il push
sudo git push etc
(oppure sudo git push etc trunk) ? 
  • Convertire il trunk nel repository centrale
sudo chmod a+rX /files/git/repos/etc
cd /files/git/repos/etc
  • Se ha lo standard layout:
sudo git symbolic-ref HEAD refs/heads/trunk
sudo git branch -m trunk master
  • Se ha solo un folder principale:
sudo git symbolic-ref HEAD refs/heads/git-svn
sudo git branch -m git-svn master
  • Se ha lo standard layout, creare lo script per convertire i branches e tags
sudoedit convert-tags-branches
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done
sudo chmod +x convert-tags-branches
  • Convertire il branches ed i tag
sudo ./convert-tags-branches
  • Se ha un solo un folder principale
cd /tmp/
sudo mkdir etc
cd etc/
sudo git clone /files/git/repos/etc .
sudo git mv trunk/* .
sudo git mv trunk/.pwd.lock .
sudo git mv trunk/.serial.conf.old .
sudo git commit -a -m "* removed trunk"
sudo git push
  • Risistemare le permission
cd /tmp
sudo chmod 750 /files/git/repos/etc
  • Provare a fare un clone:
cd /tmp
mkdir test
cd test
sudo git clone /files/git/repos/etc/ .
  • Per linkare la working copy attuale, fare un clone nuovo, per avere un repository pulito
cd /tmp
sudo mkdir etc
cd etc
sudo git clone /files/git/repos/etc .
  • Pulire la working copy dai flder .svn
cd /etc/
for RES in $(sudo find . -name \.svn); do sudo rm -rf $RES; done
  • Spostare il repository clonato
sudo mv /tmp/etc/.git .
  • Eventualmente aggiungere dei files .placeholder nelle directories vuote, perchè git non le versiona (ma questo è un lavoro da fare seguendo Gestire /etc sotto git con etckeeper ...):
 #sudo find . -type d -empty | grep -v \.git
  • Verificare eventuali discrepanze ed allineare
sudo git status
sudo git add .
sudo git commit -a -m "* First git commit"
sudo git push


Riferimenti

Con git-svn-migrate

Lo script è compatibile solo con git>=1.7 (NON va da lenny)

  • Installare il convertitore git-svn
sudo apt-get install git-core git-svn
  • Scaricare lo script di conversione
cd /tmp/
  • Prelevare da
git clone http://github.com/JohnAlbin/git-svn-migrate.git
cd git-svn-migrate/

  • Fare l'ultimo commit sul repository svn
  • 'ATTENZIONE: Assicurarsi di poter accedere senza richiesta di username e password al repository svn in caso di url http
  • Creare il file contenente l'elenco dei repository da convertire
vi repositories-list.txt
repositoryName1 file:///files/svn/repositories/etc
repositoryName2 http://servername.example.com/url/to/svn/repository
  • Creare il file con gli autori:
sudo ./fetch-svn-authors.sh --url-file=repositories-list.txt > author-transform.txt
  • Editarlo per correggerlo:
vi author-transform.txt
root = Root Servername <root@servername.example.com>
  • Convertire il repository:
sudo ./git-svn-migrate.sh --url-file=repositories-list.txt --authors-file=author-transform.txt /tmp/git-converted


  • Creare la dir per il repo centrale git vuoto
sudo mkdir -p /files/git/repos/etc
cd /files/git/repos/etc
  • Spostarci quello convertito
sudo mv /tmp/git-converted/etc.git/* /files/git/repos/etc

Riferimenti