it-swarm.com.de

Migrieren Sie von CVS zu Git, ohne den Verlauf zu verlieren

Ich muss wissen, ob es eine Möglichkeit gibt, meinen Code von CVS Source Control zu Git zu migrieren?

Wenn ja, wie sieht es mit meiner Commit-Geschichte aus?

33
Ahmed Alaa

Ich habe nicht persönlich eine Konvertierung von CVS in Git vorgenommen, aber ich glaube, dass Eric Raymond cvs-fast-export das zu verwendende Werkzeug ist. Er hat die Manpage hier gepostet. cvsps ist ein weiteres Tool, das von Eric gepflegt wird, aber kürzlich wurde es zugunsten von cvs-fast-export verworfen. cvs2git ist ein anderes Tool, das auf einigen Maschinen derselben Art wie cvs2svn aufgebaut ist. Letzteres war extrem geschickt, und ich habe große Hoffnung, dass cvs2git ebenso gut ist.

Eine Sache zu beachten: CVS ist ein ziemlich kaputtes RCS. Es kann sein, dass Inhalte enthalten sind, die in Git nicht exakt wiedergegeben werden können. IOW, da gibt es eine gewisse Ungleichheit der Impedanz, aber die Tools sind sehr bemüht, so viel wie möglich zu erhalten. Stellen Sie sicher, dass Sie Ihre Conversion überprüfen und mit den Ergebnissen zufrieden sind. Sie müssen möglicherweise einen Teil des Git-Verlaufs korrigieren, um etwas akzeptableres zu erhalten, aber ich bezweifle, dass Sie dies tun müssen.

16

Hier ist der Prozess, mit dem ich ein SourceForge CVS-Repo mit cvs2git ( die neueste stabile Version ist hier nach Git migriert habe, aber mit IIRC habe ich die github dev-Version verwendet), die funktioniert Windows und Linux ohne Kompilierung, da es sich nur um Python handelt:

So importieren Sie von SourceForge CVS nach Git.
Zuerst müssen Sie das CVS-Repo mit der gesamten Historie herunterladen/auschecken (nicht nur den HEAD/Trunk auschecken):

rsync -av rsync://PROJECT.cvs.sourceforge.net/cvsroot/PROJECT/\* cvs  

verwenden Sie dann cvs2git (Python-Skript, funktioniert auf allen Plattformen, keine Kompilierung erforderlich):

python cvs2git --blobfile="blob.dat" --dumpfile="dump.dat" --username="username_to_access_repo" --options=cvs2git.options --fallback-encoding utf-8 cvs  

dies sollte zwei Dateien erzeugt haben, die alle Ihre Lebensläufe enthalten. Sie können sie in einem Texteditor öffnen, um zu überprüfen, ob der Inhalt korrekt ist.

dann initialisiere dein Git Repo in einem anderen Ordner:

mkdir gitexport/
cd gitexport
git init  

laden Sie dann den exportierten CVS-Verlauf auf git:

cat ../{blob,dump}.dat | git fast-import  

und platziere dann den git commit-Cursor am Ende des Verlaufs:

git reset --hard  

schließlich und optional können Sie auf Ihr Remote-Git-Repository pushen:

git Push -u Origin master  

natürlich musst du vorher git remote add Origin https://your_repo_url

Hinweis: cvs2git.options ist eine JSON-formatierte Konfigurationsdatei für cvs2git Hier können Sie Transformationen für verschiedene Dinge wie Autorennamen angeben (sodass deren Spitznamen nach dem Import automatisch in ihren vollständigen Namen umgewandelt werden). Siehe Dokumentation hier oder mitgelieferte Beispieloptionsdatei .

Auch Sie müssen das Repo mit dieser Methode nicht besitzen, Sie können SourceForge-Projekte migrieren, die Sie nicht besitzen (Sie benötigen nur das Recht dazu) Kasse, so funktioniert dies auf jedem öffentlichen Repo).

22
gaborous

Sie können verwenden Sie git-cvsimport , um Ihr CVS-Repository in Git zu importieren. In der Standardeinstellung wird jede Revision überprüft, sodass Sie einen relativ vollständigen Verlauf erhalten.

Abhängig von Ihrem Betriebssystem müssen Sie möglicherweise die Unterstützung hierfür separat installieren. Auf einem Ubuntu-Computer benötigen Sie beispielsweise das git-cvs-Paket.

Diese Antwort geht detaillierter ein.

10
Chris

Ich habe kürzlich (2016) reposurgeon von Eric Raymond verwendet, um ein CVS-Repo von sourceforge nach git zu importieren. Ich war sehr positiv überrascht und es hat sehr gut geklappt ... Nach früheren Erfahrungen mit cvs2svn und anderen Tools empfehle ich ohne zu zögern einen Reposurgeon für diese Art von Aufgaben.

Eric hat einen einfachen Migrationsleitfaden veröffentlicht hier

3
crististm

gaborous 's answer verwendet git fast-import , was bei der Protokollmeldung fehlschlagen könnte not verschlüsselt in UTF-8.

Das wird mit Git 2.23 (Q2 2019) besser funktionieren: Dem Paar "git fast-export/import" Wurde beigebracht, Commits mit Protokollnachrichten in einer anderen Codierung als UTF-8 besser zu handhaben.

Siehe commit e80001f , commit 57a8be2 , commit ccbfc96 , commit 3edfcc6 , commit 32615ce (14. Mai 2019) von Elijah Newren (newren) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in Festschreiben 66dc7b6 , 13. Juni 2019)

fast-export: Automatische Neucodierung von Commit-Nachrichten nur auf Anfrage

Die automatische Neukodierung von Festschreibungsnachrichten (und das Löschen des Kodierungskopfs) schadet Versuchen, umkehrbare Verlaufsumschreibungen durchzuführen (z. B. sha1sum <-> sha256sum-Übergänge, einige Teilbaumumschreibungen), und scheint mit dem an anderer Stelle in fast-export explizite Benutzeranfragen zur Änderung der Ausgabe erfordern (zB --signed-tags=strip, --tag-of-filtered-object=rewrite).
Fügen Sie ein --reencode - Flag hinzu, das der Benutzer verwenden kann, und setzen Sie es wie andere Flags für den schnellen Export standardmäßig auf 'abort'. .

Das heißt, das Documentation/git-fast-export enthält jetzt:

 --reencode=(yes|no|abort)::

Geben Sie an, wie der Header encoding in Festschreibungsobjekten behandelt werden soll.

  • Wenn Sie nach 'abort' fragen (dies ist die Standardeinstellung), stürzt dieses Programm ab, wenn Sie auf ein solches Festschreibungsobjekt stoßen.
  • Mit 'yes' wird die Commit-Nachricht in UTF-8 umcodiert.
  • Mit 'nein' wird die ursprüngliche Kodierung beibehalten.

fast-export: Vermeiden Sie das Entfernen des Kodierungs-Headers, wenn keine Neukodierung möglich ist

Wenn fast-export Auf ein Commit mit einem 'encoding'-Header stößt, versucht es, UTF-8 erneut zu codieren, und löscht dann den Encoding-Header.
Wenn die Neucodierung in UTF-8 jedoch fehlschlägt, weil z. Eines der Zeichen in der Festschreibungsnachricht war in der alten Codierung ungültig. Ansonsten müssen wir die ursprüngliche Codierung beibehalten. Andernfalls gehen die Informationen verloren, die zum Verständnis aller anderen (gültigen) Zeichen in der ursprünglichen Festschreibungsnachricht erforderlich sind.

fast-import: Unterstützt 'Encoding' Commit Header

Da git Commit-Nachrichten mit einer anderen Codierung als UTF-8 unterstützt, erlauben Sie fast-import, Solche Commits zu importieren.
Dies kann für Benutzer nützlich sein, die Commit-Nachrichten von einem externen System nicht neu codieren möchten, und kann auch nützlich sein, um reversible Verlaufsänderungen (z. B. sha1sum <-> sha256sum-Übergänge oder Teilbaum-Arbeit) mit Git-Repositorys zu erzielen, die haben in ihrer Festschreibungshistorie spezielle Codierungen verwendet.

Das Documentation/git-fast-import enthält jetzt:

kodierung "

Der optionale Befehl encoding gibt die Codierung der Festschreibungsnachricht an.
Die meisten Commits sind UTF-8 und die Codierung wird weggelassen, dies ermöglicht jedoch das Importieren von Commit-Nachrichten in git, ohne sie zuvor erneut zu codieren.


Zu sehen ist dieser Test , das einen Autor mit Nicht-ASCII-Zeichen im Namen verwendet, aber keine spezielle Festschreibungsnachricht.
Es überprüft, ob die Neuverschlüsselung in UTF-8 funktioniert hat, indem es die Größe überprüft:

Wenn das Festschreibungsobjekt nicht neu codiert wird, beträgt es 240 Byte.

  • Durch Entfernen des Headers "encoding iso-8859-7\n" Werden 20 Byte gelöscht.
  • Neucodierung des Pi-Zeichen π von \xF0 (\360) In ISO-8859-7 zu \xCF\x80 (\317\200) In UTF-8 wird ein Byte hinzugefügt.

Überprüfen Sie die erwartete Größe.

0
VonC

Um ein Projekt von sourceforge nach github zu klonen, habe ich die folgenden Schritte ausgeführt.

PROJECT=some_sourceforge_project_name
GITUSER=rubo77
rsync -av rsync://a.cvs.sourceforge.net/cvsroot/$PROJECT/\* cvs
svn export --username=guest http://cvs2svn.tigris.org/svn/cvs2svn/trunk cvs2svn-trunk
cp ./cvs2svn-trunk/cvs2git-example.options ./cvs2git.options
vim cvs2git.options # edit run_options.set_project
cvs2svn-trunk/cvs2git --options=cvs2git.options --fallback-encoding utf-8

erstellen Sie einen leeren Git bei https://github.com/$GITUSER/$PROJECT.git

git clone [email protected]:$GITUSER/$PROJECT.git $PROJECT-github
cd $PROJECT-github
cat ../cvs2git-tmp/git-{blob,dump}.dat | git fast-import
git log
git reset --hard
git Push
0
rubo77