Convertire un repository Svn in Git: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
|||
| (21 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
==Manualmente== | ==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 | |||
<pre> | |||
#!/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</pre> | |||
* Convertire la working copy attuale '''ATTENZIONE, CONTROLLARE !!!!''': | |||
'''ATTENZIONE, CONTROLLARE !!!!''' | |||
'''ATTENZIONE, CONTROLLARE !!!!''' | |||
<pre> | |||
#!/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 | |||
</pre> | |||
* Pulire la etc: | |||
<pre> | |||
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 | |||
</pre> | |||
===Procedura in dettaglio=== | |||
* Installare il convertitore git-svn | * Installare il convertitore git-svn | ||
sudo apt-get install git-core 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 | * Creare il repo git vuoto ed inizializzarlo | ||
| Line 8: | Line 131: | ||
sudo mkdir -p /files/git/repos/etc | sudo mkdir -p /files/git/repos/etc | ||
cd /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 | sudo git init --bare | ||
* Fare il checkout del repository svn per estrarre gli autori | * Fare il checkout del repository svn per estrarre gli autori | ||
| Line 27: | Line 151: | ||
root = Root Fireman <root@fireman.mannesmann.priv> | root = Root Fireman <root@fireman.mannesmann.priv> | ||
* Convertire il repository '''CHE DEVE AVERE IL LAYOUT STANDARD trunk/ tags/ branches/''' | * 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 | sudo mkdir /tmp/git | ||
cd /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 . | sudo git svn clone file:///files/svn/repositories/etc --no-metadata -A ../svn/authors-transform.txt --stdlayout . | ||
* Convertire gli ignore | * 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 | 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 add .gitignore | ||
sudo git commit -m 'Convert svn:ignore properties to .gitignore.' | sudo git commit -m 'Convert svn:ignore properties to .gitignore.' | ||
| Line 48: | Line 182: | ||
* Convertire il trunk nel repository centrale | * Convertire il trunk nel repository centrale | ||
sudo chmod a+rX /files/git/repos/etc | |||
cd /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 | |||
sudo git branch -m | * 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 | sudoedit convert-tags-branches | ||
| Line 69: | Line 208: | ||
sudo chmod +x convert-tags-branches | sudo chmod +x convert-tags-branches | ||
* Convertire il | * Convertire il branches ed i tag | ||
sudo ./convert-tags-branches | sudo ./convert-tags-branches | ||
* Se ha un solo un folder principale | |||
<pre> | |||
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 | |||
</pre> | |||
* 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=== | ===Riferimenti=== | ||
| Line 78: | Line 263: | ||
'''Lo script è compatibile solo con git>=1.7 (NON va da lenny)''' | '''Lo script è compatibile solo con git>=1.7 (NON va da lenny)''' | ||
* Installare il convertitore git-svn | * Installare il convertitore git-svn | ||
| Line 86: | Line 270: | ||
cd /tmp/ | cd /tmp/ | ||
* | * Prelevare da | ||
git clone | git clone http://github.com/JohnAlbin/git-svn-migrate.git | ||
cd git-svn-migrate/ | cd git-svn-migrate/ | ||
* Fare l'ultimo commit sul repository svn | * 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 | * Creare il file contenente l'elenco dei repository da convertire | ||
vi repositories-list.txt | vi repositories-list.txt | ||
file:///files/svn/repositories/etc | repositoryName1 file:///files/svn/repositories/etc | ||
repositoryName2 http://servername.example.com/url/to/svn/repository | |||
* Creare il file con gli autori: | * Creare il file con gli autori: | ||
| Line 109: | Line 290: | ||
vi author-transform.txt | vi author-transform.txt | ||
root = Root | root = Root Servername <root@servername.example.com> | ||
* Convertire il repository: | * Convertire il repository: | ||
| Line 119: | Line 300: | ||
sudo mkdir -p /files/git/repos/etc | sudo mkdir -p /files/git/repos/etc | ||
cd /files/git/repos/etc | cd /files/git/repos/etc | ||
* Spostarci quello convertito | * Spostarci quello convertito | ||
sudo mv /tmp/git-converted/etc.git/* /files/git/repos/etc | sudo mv /tmp/git-converted/etc.git/* /files/git/repos/etc | ||
===Riferimenti=== | ===Riferimenti=== | ||
*[https://github.com/JohnAlbin/git-svn-migrate git-svn-migrate] | *[https://github.com/JohnAlbin/git-svn-migrate git-svn-migrate] | ||
Latest revision as of 16:15, 2 November 2011
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