Close

Git convert: A step in migration from SVN to Git

De volgende stap in de migratie van SVN naar Git is het importeren van de inhoud van de SVN-repository in een nieuwe Git-repository. We doen dit met het hulpprogramma git svn dat bij de meeste Git-distributies wordt meegeleverd, en vervolgens zullen we de resultaten opschonen met svn-migration-scripts.jar.

Pas op dat het conversieproces voor grotere repository's veel tijd in beslag kan nemen, zelfs als je kloont vanuit een lokale SVN-repository. Ter vergelijking: de conversie van een repository van 400 MB met 33.000 commits op main duurde ongeveer 12 uur.

Voor repository's van redelijke omvang moeten de volgende stappen worden uitgevoerd op de lokale computer van de migratieleider. Als je echter een zeer grote SVN-repository hebt en de conversietijd wilt verkorten, kun je git svn clone draaien op de SVN-server in plaats van op de lokale computer van de migratieleider. Dit voorkomt de overhead van klonen via een netwerkverbinding.


De SVN-repository klonen


De opdracht git svn clone zet de trunk, branches en tags in je SVN-repository om in een nieuwe Git-repository. Afhankelijk van de structuur van je SVN-repo moet de opdracht anders worden geconfigureerd.

Git-migratie: de opdracht git svn clone
Databases
gerelateerd materiaal

Een volledige Git-repository verplaatsen

Logo Bitbucket
Oplossing bekijken

Git leren met Bitbucket Cloud

Standaard SVN-indelingen

Als je SVN-project de standaardindeling van de mappen /trunk, /branches en /tags gebruikt, kun je de optie --stdlayout gebruiken in plaats van handmatig de structuur van de repository op te geven. Voer de volgende opdracht uit in de map ~/GitMigration:

git svn clone --stdlayout --authors-file=authors.txt
 <svn-repo>/<project> <git-repo-name>

Hierbij is <svn-repo> de URI van de SVN-repository die je wilt migreren, <project> de naam van het project dat je wilt importeren, en <git-repo-name> de mapnaam is van de nieuwe Git-repository.

Als je bijvoorbeeld een project zou migreren met de naam Confluence, gehost op https://svn.atlassian.com, zou je het volgende kunnen doen:

git svn clone --stdlayout --authors-file=authors.txt https://svn.atlassian.com/Confluence ConfluenceAsGit

Niet-standaard SVN-indelingen

Als je SVN-repository geen standaardindeling heeft, moet je de locaties van je trunk, branches en tags opgeven met behulp van de opdrachtregelopties --trunk, --branches en --tags. Als je bijvoorbeeld branches hebt opgeslagen in zowel de map /branches als de mappen /bugfixes, kun je de volgende opdracht gebruiken:

git svn clone --trunk=/trunk --branches=/branches 
 --branches=/bugfixes --tags=/tags --authors-file=authors.txt 
 <svn-repo>/<project> <git-repo-name>

De nieuwe Git-repository inspecteren


Wanneer git svn clone klaar is (dit kan even duren), vind je een nieuwe map met de naam <git-repo-name> in ~/GitMigration. Dit is de geconverteerde Git-repository. Je kunt naar gaan en een van de standaard Git-opdrachten uitvoeren om je project te verkennen.

Branches en tags worden niet geïmporteerd in de nieuwe Git-repository, zoals je zou verwachten. Je zult geen van je SVN-branches vinden in de output van git branch, en je zult ook geen van je SVN-tags vinden in de output van git-tag. Maar als je git branch -r gebruikt, tref je alle branches en tags uit je SVN-repository aan. De opdracht git svn clone importeert je SVN-branches als externe branches en importeert je SVN-tags als externe branches met het voorvoegsel tags/.

Git-migratie: structuur van een gekloonde Git-repo

Dit gedrag maakt bepaalde synchronisatieprocedures in twee richtingen eenvoudiger, maar het kan erg verwarrend zijn als je een Git voor eenrichtingsmigratie probeert te maken. Daarom is onze volgende stap het omzetten van deze externe branches in lokale branches en echte Git-tags.

De nieuwe Git-repository opschonen


Het script clean-git dat is opgenomen in svn-migration-scripts.jar zet de SVN-branches om in lokale Git-branches en de SVN-tags in volwaardige Git-tags. Merk op dat dit een destructieve operatie is en dat je geen commits van de Git-repository terug naar de SVN-repository kunt verplaatsen.

Als je deze migratiehandleiding volgt, is dat geen probleem, want daarin wordt gepleit voor eenrichtingssynchronisatie van SVN naar Git (de Git-repository wordt beschouwd als alleen-lezen tot na de stap Migrate). Als je echter van plan bent om tijdens het migratieproces te committen naar de Git-repository en de SVN-repository, moet je de volgende opdrachten niet uitvoeren. Dit is een geavanceerde taak, die niet wordt aanbevolen voor een typisch project.

Om te zien wat er kan worden opgeschoond, voer je de volgende opdracht uit in <~/GitMigration/git-repo-name>:

java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git

Hiermee worden alle wijzigingen uitgevoerd die het script wil aanbrengen, maar in feite worden er helemaal geen wijzigingen aangebracht. Om deze wijzigingen uit te voeren, moet je de optie --force gebruiken, zoals:

java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git --force

Je zou nu al je SVN-branches moeten zien in de output van git branch, samen met je SVN-tags in de output van git tag. Dit betekent dat je met succes je SVN-project hebt geconverteerd naar een Git-repository.

Samenvatting


In deze stap heb je een SVN-repository omgezet in een nieuwe Git-repository met de opdracht git svn clone, en vervolgens de structuur van de resulterende repository opgeschoond met svn-migration-scripts.jar. In de volgende stap leer je hoe je deze nieuwe Git-repo synchroon kunt houden met alle nieuwe commits naar de SVN-repository. Dit zal een soortgelijk proces zijn als de conversie, maar er gelden enkele belangrijke workfloverwegingen tijdens deze transitieperiode.


Deel dit artikel
Volgend onderwerp

Aanbevolen artikelen

Bookmark deze resources voor meer informatie over soorten DevOps-teams of voor voortdurende updates over DevOps bij Atlassian.

Mensen die samenwerken met een muur vol tools

Bitbucket-blog

Toelichting DevOps

DevOps-leertraject

Demo Den Feature-demo's met Atlassian-experts

Hoe Bitbucket Cloud werkt met Atlassian Open DevOps

Meld je aan voor onze DevOps-nieuwsbrief

Thank you for signing up