Freigeben über


Erfahren Sie, wie Sie von Subversion (SVN) zu Git migrieren, einschließlich Verlauf

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019

Wenn Sie von einem anderen Versionskontrollsystem wie Subversion (SVN) zu Git wechseln, empfehlen wir in der Regel eine „Spitzenmigration“ (Tip Migration), bei der nur die letzte Version der Repositoryinhalte migriert wird, ohne den Verlauf einzubeziehen. Viele Personen möchten jedoch eine weitergehende Migration durchführen, einschließlich des Verlaufs. In den Anleitungen in diesem Artikel wird eine Migration mit Verlauf vorgestellt.

SVN-Migrationen zu Git können unterschiedlich komplex sein, je nachdem, wie alt das Repository ist und wie viele Branches erstellt und zusammengeführt wurden, und ob Sie das reguläre SVN oder eine nahe Variante wie SVK verwenden.

Unter folgenden Umständen könnte es einfach sein:

  • Sie haben ein neues Repository.
  • Sie verfügen über eine Standardeinrichtung mit Verzeichnissen für Trunk, Branches und Tags.

Unter folgenden Umständen könnte es komplex sein:

  • Ihr Team hat viele Branch- und Mergevorgänge durchgeführt.
  • Ihr Repository folgt einer nicht standardmäßigen Verzeichniseinrichtung.
  • Ihre Verzeichniseinrichtung hat sich im Laufe der Zeit geändert.

Es gibt mehrere Möglichkeiten, von SVN zu Git zu migrieren. Der in diesem Artikel beschriebene Ansatz basiert auf der Verwendung von git-svn, einer Git-Erweiterung, mit der Sie ein Subversion-Repository in ein lokales Git-Repository auschecken und dann Änderungen aus dem lokalen Git-Repository zurück in das Subversion-Repository pushen können. Diese Schritte bieten eine detaillierte Übersicht über den Prozess der Migration von SVN zu Git in einer Windows-Umgebung, ohne dass eine Synchronisierung zurück zum ursprünglichen SVN-Repository erfolgt. Das Ergebnis ist ein leeres Git-Repository, das Sie für den Rest Ihres Teams freigeben können.

Hinweis

Bevor Sie versuchen, Ihren Quellcode von einem zentralen Versionskontrollsystem zu Git zu migrieren, sollten Sie sich mit den Unterschieden zwischen zentralen und verteilten Versionskontrollsystemen vertraut machen und die Migration Ihres Teams planen. Nachdem Sie sich vorbereitet haben, können Sie die Migration beginnen.

Der allgemeine Workflow für die Migration von SVN zu Git sieht folgendermaßen aus:

  • Vorbereiten einer Migrationsumgebung
  • Konvertieren des SVN-Quellrepositorys in ein lokales Git-Repository
  • (Optional) Synchronisieren des lokalen Git-Repositorys mit allen Änderungen aus dem SVN-Repository, während Entwickler weiterhin SVN verwenden
  • Pushen des lokalen Git-Repositorys zu einem Git-Remoterepository, das in Azure Repos gehostet wird
  • Sperren des SVN-Repositorys, Synchronisieren aller verbleibenden Änderungen aus dem SVN-Repository mit dem lokalen Git-Repository und Pushen der endgültigen Änderungen in das Git-Remoterepository in Azure Repos
  • Entwickler wechseln zu Git als Hauptsystem für die Quellcodeverwaltung

Vorbereiten einer Migrationsumgebung

Konfigurieren Sie eine Migrationsumgebung auf einer lokalen Arbeitsstation, und installieren Sie die folgende Software:

Sie müssen auch ein Git-Repository für Ihre Organisation erstellen, um das konvertierte SVN-Repository zu hosten. Möglicherweise folgen Sie dem Erstellen eines neuen Git-Repositorys in Ihrem Projekt.

Konvertieren des SVN-Quellrepositorys in ein lokales Git-Repository

Das Ziel dieses Schritts ist die Konvertierung des Subversion-Quellrepositorys in ein lokales reines Git-Repository. Ein bares Git-Repository verfügt nicht über ein lokales Auschecken von Dateien, die geändert werden können, sondern nur den Verlauf des Repositorys und die Metadaten zum Repository selbst. Dies ist das empfohlene Format für die Freigabe eines Git-Repositorys über ein Remoterepository, das von einem Dienst wie Azure Repos gehostet wird.

Tipp

Reine Git-Repositorys sind anders strukturiert und verhindern aufgrund der Tatsache, dass sie kein Arbeitsverzeichnis haben, einen direkten Commit für das Repository.

Reines Git-Repository

Abrufen einer Liste aller Subversion-Ersteller

Subversion verwendet nur den Benutzernamen für jeden Commit, während Git sowohl einen echten Namen als auch eine E-Mail-Adresse speichert. Standardmäßig führt das Tool „git-svn“ den SVN-Benutzernamen in den Feldern für Ersteller und E-Mail-Adresse auf. Sie können jedoch eine Zuordnungsdatei für SVN-Benutzer zusammen mit den entsprechenden Git-Namen und E-Mail-Adressen erstellen.

Subversion-Benutzer

Subversion-Benutzer

Git-Benutzer

Git-Benutzer

Um eine Liste aller SVN-Benutzer aus dem Stammverzeichnis Ihres lokalen Subversion-Auscheckvorgangs zu extrahieren, führen Sie den folgenden PowerShell-Befehl aus:

Führen Sie für Ergebnisse in der utf8NoBOM Codierung den folgenden Befehl aus:

svn.exe log --quiet | ? { $_ -notlike '-*' } | % { "{0} = {0} " -f ($_ -split ' | ')[1] } | Select-Object -Unique | Sort-Object | Out-File 'authors-transform.txt' -Encoding utf8NoBOM

Führen Sie für Ergebnisse in der ASCII Codierung den folgenden Befehl aus:

svn.exe log --quiet | ? { $_ -notlike '-*' } | % { "{0} = {0} " -f ($_ -split ' | ')[1] } | Select-Object -Unique | Sort-Object | Out-File 'authors-transform.txt' -Encoding ASCII

Dieser Befehl ruft alle Protokollnachrichten ab, extrahiert die Benutzernamen, entfernt alle doppelten Benutzernamen, sortiert die Benutzernamen und platziert sie in einer authors-transform.txt Datei im UTF-8-Format (oder ASCII-Format, je nachdem, welche Codierung Sie angegeben haben). Sie können dann jede Zeile in der Datei bearbeiten, um eine Zuordnung von SVN-Benutzern zu ordnungsgemäß formatierten Git-Benutzern zu erstellen. Sie können z. B. jamal = jamal <jamal> zu jamal = Jamal Hartnett <jamal@fabrikam-fiber.com> zuordnen.

Klonen des Subversion-Repositorys mit git-svn

Mit dem folgenden Befehl wird die standardmäßige git-svn-Transformation mithilfe der im vorherigen Schritt erstellten Datei „authors-transform.txt“ ausgeführt. Er legt das Git-Repository im Ordner c:\mytempdir auf Ihrem lokalen Computer ab.

git svn clone ["SVN repo URL"] --prefix=svn/ --no-metadata --authors-file "authors-transform.txt" --stdlayout c:\mytempdir

Hinweis

Der --prefix=svn/ ist notwendig, da die Tools sonst nicht zwischen SVN-Revisionen und importierten Versionen unterscheiden können. Wir empfehlen, ein Präfix (mit einem abschließenden Schrägstrich) festzulegen, da sich Ihre Verweise für die SVN-Nachverfolgung dann unter refs/remotes/$prefix/ befinden, was mit dem Git-eigenen Branchlayout (refs/remotes/$remote/) für die Remotenachverfolgung kompatibel ist.

Das Festlegen eines Präfixes ist auch nützlich, wenn Sie mehrere Projekte nachverfolgen möchten, die ein gemeinsames Repository teilen. Standardmäßig ist das Präfix auf origin/ festgelegt.

Wenn Sie den Standardtrunk, Verzweigungen, Tags-Layout verwenden, fügen --stdlayoutSie einfach ein. Wenn Sie jedoch über etwas anderes verfügen, müssen Sie möglicherweise die --trunk, --branches und --tags übergeben, um zu ermitteln, worum es sich jeweils handelt. Wenn Ihre Repositorystruktur z. B. trunk/companydir lautet und Sie das Branch anstelle von Trunk erstellen, würden Sie wahrscheinlich --trunk=trunk/companydir --branches=branches verwenden.

git svn clone ["SVN repo URL"] --prefix=svn/ --no-metadata --trunk=/trunk --branches=/branches --tags=/tags  --authors-file "authors-transform.txt" c:\mytempdir

Hinweis

Dieser Befehl kann je nach Größe des SVN-Repositorys einige Minuten bis mehrere Stunden dauern. Nach Abschluss haben Sie ein Git-Auschecken Ihres Repositorys.

Konvertieren von versionskontrollspezifischen Konfigurationen

Wenn Ihr SVN-Repository svn:ignore-Eigenschaften verwendet hat, können Sie wie folgt in eine .gitignore-Datei konvertieren:

cd c:\mytempdir
git svn show-ignore --id=origin/trunk > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

Tipp

Erfahren Sie mehr über .gitignore: Ignorieren von Dateiänderungen mit Git

Pushen eines Repositorys in ein reines Git-Repository

In diesem Schritt erstellen Sie ein bares Repository und legen dessen Standardbranch dem Trunk-Branchnamen von SVN zu.

  1. Erstellen eines reinen Git-Repositorys

    git init --bare c:\new-bare.git
    cd c:\new-bare.git
    git symbolic-ref HEAD refs/heads/svn/trunk
    
  2. Pushen des lokalen Git-Repositorys in das neue reine Git-Repository

    cd c:\mytempdir 
    git remote add bare c:\new-bare.git 
    git config remote.bare.push refs/remotes/*:refs/heads/* 
    git push bare 
    
  3. Benennen Sie den Branch trunk in main um. Ihr Hauptentwicklungsbranch wird „trunk“ genannt, was dem Namen entspricht, den er in Subversion hatte. Sie können ihn wie folgt in den standardmäßigen main-Branch von Git umbenennen:

    cd c:\new-bare.git
    git branch -m svn/trunk main
    
  4. Bereinigen von Branches und Tags: git-svn konvertiert alle Subversion-Tags in sehr kurze Branches in Git in der Form „Tags/Name“. Sie sollten alle diese Branches in echte Git-Tags konvertieren oder sie löschen.

Migrieren von SVN-Tags zu Git-Tags

cd c:\new-bare.git
git for-each-ref --format='%(refname)' refs/heads/svn/tags | % { $_.Replace('refs/heads/svn/tags/','') } | % { git tag $_ "refs/heads/svn/tags/$_"; git branch -D "svn/tags/$_" }

Erweiterte Migrationen

Erstellen aller SVN-Branches als richtige Git-Branches

Es ist zwar einfach, alle SVN-Branches als richtige Git-Branches zu erstellen, aber wir empfehlen Ihnen, die folgenden Punkte zu beachten, bevor Sie fortfahren:

  • Wenn Featurebranches vorhanden sind: Können Sie vor der Migration warten, bis sie in den Trunk integriert sind?

  • Wenn Releasebranches vorhanden sind: Ist es sinnvoll, SVN für die Wartung beizubehalten? Sind Sie beim Migrieren von Featurebranches bereit, Branches aus Git heraus zu warten?

Wenn Sie vorhandene Branches weiterhin migrieren möchten, führen Sie den folgenden PowerShell-Befehl aus:

git for-each-ref --format='%(refname)' refs/remotes | % { $_.Replace('refs/remotes/','') } | % { git branch "$_" "refs/remotes/$_"; git branch -r -d "$_"; }

Hinweis

Dieser Befehl kann je nach Größe des SVN-Repositorys einige Minuten bis mehrere Stunden dauern. Nach Abschluss haben Sie ein Git-Auschecken Ihres Repositorys.

Migrieren bestimmter Revisionen

Wenn nicht angegeben, migriert git-svn clone alle Revisionen des ersten Commits (r1) zu HEAD. Wenn Sie nur eine bestimmte Reihe von Revisionen migrieren möchten, sollten Sie dem Befehl für git-svn clone die Option -r anfügen.

Wenn Sie z. B. von „rev 100“ zu HEAD migrieren müssen, sieht der Befehl wie folgt aus:

git svn clone ["SVN repo URL"] --prefix=svn/ --no-metadata --authors-file "authors-transform.txt" --stdlayout c:\mytempdir -r100:HEAD

Aktualisieren Ihres Workflows

Der Wechsel von einer zentralisierten Versionskontrolle zu Git umfasst mehr als nur die Migration von Code. Für Ihr Team ist ein entsprechendes Training erforderlich, um zu verstehen, wie sich Git von Ihrem bestehenden Versionskontrollsystem unterscheidet und wie sich diese Unterschiede auf die tägliche Arbeit auswirken. Weitere Informationen

Referenzinformationen

Autoren: Hosam Kamel, William H. Salazar | Suchen des Artikelursprungs und Herstellen einer Verbindung mit dem ALM | DevOps Rangers Leitfaden zum Branching

(c) 2017 Microsoft Corporation. Alle Rechte vorbehalten. Dieses Dokument wird „wie besehen“ zur Verfügung gestellt. Die in diesem Dokument enthaltenen Informationen und zum Ausdruck gebrachten Ansichten, auch URL- und andere Internet-Websitebezüge, können ohne vorherige Ankündigung geändert werden. Sie tragen das alleinige Verwendungsrisiko.

Mit diesem Dokument erhalten Sie keinerlei Rechte an geistigem Eigentum in einem beliebigen Produkt von Microsoft. Dieses Dokument darf für interne Referenzzwecke kopiert und verwendet werden.