Git Convert: een stap in de migratie van SVN naar 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 gaan 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.
*Houd er rekening mee dat deze scripts zijn geschreven toen alleen git-versie 1.8.x beschikbaar was. Daarom moet die versie van git worden gebruikt om de scripts te laten werken.
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.
gerelateerd materiaal
Een volledige Git-repository verplaatsen
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/
.
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.