Vraag Hoe migreer ik een SVN-repository met geschiedenis naar een nieuwe Git-repository?


Ik las de Git-handleiding, FAQ, Git - SVN-spoedcursus, enz. En ze leggen dit allemaal uit, maar nergens vind je een eenvoudige instructie zoals:

SVN-repository in: svn://myserver/path/to/svn/repos

Git repository in: git://myserver/path/to/git/repos

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

Ik verwacht niet dat het zo eenvoudig zal zijn, en ik verwacht niet dat het een enkel bevel is. Maar ik verwacht wel dat het niet probeert om iets uit te leggen - gewoon om te zeggen welke stappen moeten worden genomen, gezien dit voorbeeld.


1392
2017-09-17 02:08


oorsprong


antwoorden:


Magie:

$ git svn clone http://svn/repo/here/trunk

Git en SVN werken heel anders. Je moet Git leren en als je veranderingen van SVN stroomopwaarts wilt volgen, moet je leren git-svn. De git-svn man pagina heeft een goede voorbeelden sectie:

$ git svn --help

495
2017-09-17 18:20



Maak een gebruikersbestand (d.w.z. users.txt) voor het toewijzen van SVN-gebruikers aan Git:

user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...

U kunt deze one-liner gebruiken om een ​​sjabloon te bouwen vanuit uw bestaande SVN-repository:

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt

SVN stopt als het een ontbrekende SVN-gebruiker vindt die niet in het bestand staat. Maar daarna kunt u het bestand bijwerken en ophalen waar u was gebleven.

Trek nu de SVN-gegevens uit de repository:

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp

Deze opdracht maakt een nieuwe Git-repository in dest_dir-tmp en begin met het ophalen van de SVN-repository. Merk op dat de vlag "--stdoutout" aangeeft dat u de gemeenschappelijke "trunk /, branches /, tags /" SVN-layout hebt. Als uw lay-out verschilt, raakt u bekend met --tags, --branches, --trunk opties (in het algemeen git svn help).

Alle gangbare protocollen zijn toegestaan: svn://, http://, https://. De URL moet zich richten op de basisrepository, iets als http://svn.mycompany.com/myrepo/repository. Dat moet niet omvatten /trunk, /tag of /branches.

Merk op dat na het uitvoeren van deze opdracht het er vaak uitziet alsof de bewerking "hangt / bevriest", en het is heel normaal dat deze lang kan wachten nadat de nieuwe repository is geïnitialiseerd. Uiteindelijk zult u dan logberichten zien die aangeven dat het migreert.

Merk ook op dat als u de --no-metadata flag, zal Git informatie over de overeenkomstige SVN-revisie toevoegen aan het commit-bericht (d.w.z. git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>)

Als een gebruikersnaam niet wordt gevonden, update dan uw users.txt bestand dan:

cd dest_dir-tmp
git svn fetch

Mogelijk moet je die laatste opdracht verschillende keren herhalen, als je een groot project hebt, totdat alle subversion-commits zijn opgehaald:

git svn fetch

Wanneer voltooid, zal Git de SVN afrekenen trunk in een nieuwe tak. Alle andere takken zijn opgezet als afstandsbedieningen. U kunt de andere SVN-takken bekijken met:

git branch -r

Als u andere remote branches in uw repository wilt behouden, wilt u handmatig een lokale branch maken voor elke branch. (Stam / master overslaan.) Als u dit niet doet, worden de takken in de laatste stap niet gekloond.

git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name

Tags worden als takken geïmporteerd. Je moet een lokale branch maken, een tag maken en de branch verwijderen om ze als tags in Git te hebben. Om het te doen met de tag "v1":

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

Kloon je GIT-SVN-repository in een schone Git-repository:

git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir

De lokale vestigingen die u eerder vanuit remote branches hebt gemaakt, zijn alleen gekopieerd als externe vestigingen naar de nieuwe gekloonde repository. (Stam / mast overslaan). Voor elke filiaal die u wilt behouden:

git checkout -b local_branch origin/remote_branch

Verwijder ten slotte de remote uit je schone Git-repository die verwijst naar de nu verwijderde tijdelijke repository:

git remote rm origin

1466
2017-09-17 17:09



Cleanly Migreer je Subversion Repository naar een Git Repository. Eerst moet je een bestand aanmaken dat je Subversion commit auteursnamen toewijst aan Git-commiters, zeg maar ~/authors.txt:

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>

Dan kun je de Subversion-gegevens downloaden naar een Git-repository:

mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

Als je een Mac gebruikt, kun je dat krijgen git-svn van MacPorts door te installeren git-core +svn.

Als je subversion-repository zich op dezelfde machine bevindt als je gewenste git-repository, dan kun je deze syntaxis gebruiken voor de init step, anders allemaal hetzelfde:

git svn init file:///home/user/repoName --no-metadata

183
2017-09-21 02:15



Ik gebruikte het script svn2git en werkt zo charmant! https://github.com/nirvdrum/svn2git


67
2017-09-26 13:13



Ik stel voor om vertrouwd te raken met Git voordat je constant probeert om git-svn te gebruiken, d.w.z. SVN als gecentraliseerde repo te houden en Git lokaal te gebruiken.

Voor een eenvoudige migratie met alle geschiedenis zijn hier de enkele eenvoudige stappen:

Initialiseer de lokale repo:

mkdir project
cd project
git svn init http://svn.url

Markeer hoever u terug wilt beginnen met het importeren van revisies:

git svn fetch -r42

(of gewoon "git svn fetch" voor alle toeren)

Eigenlijk alles halen sindsdien:

git svn rebase

U kunt het resultaat van de import bekijken met Gitk. Ik weet niet zeker of dit werkt op Windows, het werkt op OSX en Linux:

gitk

Wanneer u uw SVN-repo lokaal hebt gekloond, kunt u deze mogelijk naar een gecentraliseerde Git-repo pushen voor eenvoudigere samenwerking.

Maak eerst je lege repo op afstand (misschien aan GitHub?):

git remote add origin git@github.com:user/project-name.git

Synchroniseer vervolgens eventueel je hoofdtak zodat de pull-bewerking automatisch de externe master samenvoegt met je lokale master, wanneer beide nieuwe dingen bevatten:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Daarna zou je misschien geïnteresseerd zijn om mijn eigen te proberen git_remote_branch tool, die helpt bij het omgaan met remote branches:

Eerste verklarende post: "Git remote branches"

Follow-up voor de meest recente versie: "Tijd om samen te werken met git_remote_branch"


56



Er is een nieuwe oplossing voor soepele migratie van Subversion naar Git (of voor gelijktijdig gebruik): SubGit (http://subgit.com/).

Ik werk zelf aan dit project. We gebruiken SubGit in onze repositories - sommige van mijn teamgenoten gebruiken Git en sommige Subversion en tot nu toe werkt het heel goed.

Om te migreren van Subversion naar Git met SubGit moet je het volgende uitvoeren:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

Daarna krijg je de Git-repository in svn_repos / .git en kan deze klonen, of gewoon Subversion en deze nieuwe Git-repository samen blijven gebruiken: SubGit zorgt ervoor dat beide altijd synchroon worden gehouden.

In het geval dat uw Subversion-repository meerdere projecten bevat, zullen meerdere Git-repositories worden aangemaakt in de map svn_repos / git. Om de vertaling aan te passen voordat deze wordt uitgevoerd, doet u het volgende:

$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos

Met SubGit je mag migreren naar pure Git (niet git-svn) en het gaan gebruiken terwijl Subversion nog steeds wordt gehouden zolang je het nodig hebt (voor je reeds geconfigureerde build-tools, bijvoorbeeld).

Ik hoop dat dit helpt!


29



Zie de officiële git-svn manpage. Bekijk in het bijzonder onder "Basisvoorbeelden":

Volgen en bijdragen aan een volledig door Subversion beheerd project (volledig       met een stam, tags en takken):

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags

16



Pro Git 8.2 legt het uit: http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git


14



SubGit (vs Blue Screen of Death)

subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

Het is alles.

+ Om vanuit SVN bij te werken, een Git-repository gemaakt door de eerste opdracht.

subgit import  directory/path/Local.git.Repo

Ik gebruikte een manier om direct naar Git te migreren voor een enorme repository.
Natuurlijk heb je wat voorbereiding nodig.
Maar je kunt het ontwikkelproces helemaal niet stoppen.

Hier is mijn manier.

Mijn oplossing ziet eruit als:

  • Migreer SVN naar een Git-repository
  • Werk de Git-repository bij voordat het team overschakelt naar.

Migratie kost veel tijd voor een grote SVN-repository.
Maar de voltooide migratie wordt slechts enkele seconden geüpdatet.

Natuurlijk gebruik ik SubGit, mama. git-svn maakt mij Blauwe scherm van dood. Gewoon constant. En git-svn verveelt me ​​met Git's "bestandsnaam te lang" fatale fout.

STAPPEN

1.  SubGit downloaden

2. Migratie voorbereiden en opdrachten bijwerken.

Laten we zeggen dat we het voor Windows doen (het is triviaal om naar Linux te porten).
In de installatie van een SubGit bak directory (subgit-2.X.X \ bin), maak twee .bat-bestanden.

Inhoud van een bestand / opdracht voor de migratie:

start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

De opdracht "start" is hier optioneel (Windows). Het zal toelaten om fouten te zien bij het starten en verlaten van een shell die is geopend na voltooiing van de SubGit.

U kunt hier toevoegen aanvullende parameters vergelijkbaar met git-svn. Ik gebruik alleen --default-domein myCompanyDomain.com om het domein van het e-mailadres van SVN-auteurs te herstellen.
Ik heb de structuur van de standaard SVN-repository (trunk / branches / tags) en we hadden geen problemen met het 'in kaart brengen van auteurs'. Dus ik doe niets meer.

(Als u tags zoals branches wilt migreren of als uw SVN meerdere branches / tags-mappen heeft, kunt u overwegen om de meer uitgebreide SubGit te gebruiken nadering)

Tip 1: Gebruik --minimal-revisie YourSvnRevNumber om snel te zien hoe dingen eruit komen (een soort van foutopsporing). Vooral handig om opgeloste auteursnamen of e-mails te zien.
Of om de diepte van de migratiegeschiedenis te beperken.

Tip 2: Migratie kan worden onderbroken (Ctrl + C) en hersteld door het uitvoeren van de volgende updatecommando / bestand.
Ik adviseer niet om dit voor grote repositories te doen. Ik heb de "Uit het geheugen Java + Windows-uitzondering" ontvangen.

Tip 3: Het is beter om een ​​kopie van uw resultaats bare repository te maken.

Inhoud van een bestand / commando om te updaten:

start    subgit import  directory/path/Local.git.Repo

Je mag het elk gewenst aantal keren gebruiken om de commits van het laatste team naar je Git-repository te krijgen.

Waarschuwing! Raak uw bare repository niet aan (bijvoorbeeld het maken van branches).
U neemt de volgende fatale fout:

Onherstelbare fout: zijn niet gesynchroniseerd en kunnen niet worden gesynchroniseerd ... Subversion-revisies naar Git-commits vertalen ...

3. Voer het eerste commando / bestand uit. Het duurt een lange tijd voor een grote opslagplaats. 30 uur voor mijn nederige repository.

Het is alles.
Je kunt je Git-repository op elk gewenst moment bijwerken vanuit SVN door het tweede bestand / commando uit te voeren. En voordat je je ontwikkelteam overzet naar Git.
Het duurt slechts enkele seconden.



Er is nog een handige taak.

Duw je lokale Git-repository naar een externe Git-repository

Is het jouw zaak? Laten we doorgaan.

  1. Configureer uw afstandsbedieningen

Rennen:

$ git remote add origin url://your/repo.git
  1. Bereid je voor op het initiële verzenden van je enorme lokale Git-repository naar een externe repository

Je Git kan standaard geen grote chunks verzenden. fataal: het externe uiteinde is onverwacht opgehangen

Laten we ervoor rennen:

git config --global http.postBuffer 1073741824

524288000 - 500 MB 1073741824 - 1 GB, enzovoort

Verbeter uw lokale certificaat problemen. Als uw git-server een gebroken certificaat gebruikt.

Ik heb gehandicapt certificaten.

Ook uw Git-server heeft mogelijk een beperking van het aantal verzoeken moet worden gecorrigeerd.

  1. Duw alle migratie naar de externe Git-repository van het team.

Uitgevoerd met een lokale Git:

git push origin --mirror

(git push origin '*: *' voor oude Git-versies)

Als je het volgende krijgt: error: can not spawn git: niet zo'n bestand of map... Voor mij lost de volledige recreatie van mijn repository deze fout op (30 uur). U kunt de volgende opdrachten proberen

git push origin --all
git push origin --tags

Of probeer het installeer Git opnieuw (nutteloos voor mij). Of u kunt takken van al uw tags maken en duwen. Of, of, of ...


12



reposurgeon

Voor gecompliceerde gevallen, reposurgeon door Eric S. Raymond is het gereedschap bij uitstek. Naast SVN ondersteunt het ook veel andere versiecontrolesystemen via de fast-export formaat, en ook CVS. De auteur rapporteert succesvolle conversies van oude repositories zoals Emacs en FreeBSD.

De tool blijkbaar streeft naar bijna perfecte conversie (zoals het converteren van SVN's svn:ignore eigenschappen voor .gitignore bestanden), zelfs voor moeilijke repository-indelingen met een lange geschiedenis. In veel gevallen zijn andere hulpmiddelen wellicht gemakkelijker te gebruiken.

Voordat u zich verdiept in de documentatie van de reposurgeon opdrachtregel, lees dan het uitstekende DVCS-migratiegids die stap voor stap het conversieproces doorloopt.


8