Ich verwende git-svn, um eine “Staging”-Version eines SVN-Repos zu speichern, in der andere Benutzer aus diesem Staging-Repo ziehen und dort Änderungen zurückschreiben dürfen, dann werden die Commits im Staging-Repo regelmäßig im Upstream festgeschrieben SVN-Repository.
Ich möchte wissen, ob es eine Möglichkeit gibt, die Namen der Git-Committer und die SVN-Benutzernamen zuzuordnen, damit ihre Informationen bei der Rückkehr zum SVN-Repo intakt bleiben.
Vinzenz Danen erwähnt die Option -A bei Verwendung von git svn:
Verwenden Sie also ~/git als Verzeichnis der obersten Ebene für Git-Repositories [...]
Erstellen Sie eine authors.txt-Datei.
Diese Datei ordnet die Namen von Subversion-Committern Git-Autoren zu, was zu einem korrekten Verlauf des importierten Subversion-Repositorys führt.
Für Projekte mit einer kleinen Anzahl von Committern ist dies recht einfach. Bei größeren Projekten mit vielen Committern kann dies einige Zeit in Anspruch nehmen. Die Syntax der Datei wäre:
user = Joe User <[email protected]>
vdanen = Vincent Danen <[email protected]>
Der Kurzname ist der Committer-Name für Subversion, während die Langform der vollständige Name und die E-Mail-Adresse des Benutzers sind, wie sie von Git verwendet werden.
Der letzte Schritt besteht darin, das Subversion-Repository zu klonen, das darauf basierend ein lokales Git-Repository erstellt. Angenommen, Ihr Repository verwendet die Standards /trunk, /tags und /branches, verwenden Sie:
# git svn clone --no-metadata -A authors.txt -t tags -b branches -T trunk https://svn.example.com/svn/repo
-A<filename>
--authors-file=<filename>
Die Syntax ist mit der von git-cvsimport verwendeten Datei kompatibel:
loginname = Joe User <[email protected]>
Wenn diese Option angegeben ist und git-svn
auf einen SVN-Committer-Namen trifft, der nicht in der Autorendatei existiert, bricht git-svn die Operation ab.
Der Benutzer muss dann den entsprechenden Eintrag hinzufügen.
Wiederholen des vorherigen git-svn
Befehl, nachdem die Autorendatei geändert wurde, sollte den Betrieb fortsetzen.
config key: svn.authorsfile
Das sollte für alle funktionieren git-svn
Befehle, inkl git-svn dcommit
(beim drücken zu SVN) (Hinweis: Ich habe es aber nicht direkt getestet).
Mohammed Gamal berichtet (in den Kommentaren), dass es funktioniert, aber ohne das --no-metadata
Möglichkeit.
eine zweite Möglichkeit besteht darin, ein Programm/Skript bereitzustellen, das das Mapping löst.
Sehr nützlich, wenn die Anzahl der Committer unbekannt ist, aber möglicherweise aus dem SVN-Committer-Namen “generiert” wird!
Wenn … der SVN-Committer-Name nicht in der Autorendatei existiert, bricht git svn die Operation ab. Der Benutzer muss dann den entsprechenden Eintrag hinzufügen. Den vorherigen git svn-Befehl erneut ausführen, nachdem die Autorendatei geändert wurde …
also, dafür haben wir:
--authors-prog=mapMyCompanyUsers.sh
Um nicht jeden Benutzer zwingen zu müssen, zuerst das Kartenskript auszuchecken / zu kräuseln / abzurufen, könnten Sie Folgendes bereitstellen:
$(tmpMapFile="$TMPDIR/mapSvnUsersAutomatically.$$.sh" && echo -e '#!/bin/sh\necho $1" <"$1"@example.com>"' > $tmpMapFile && chmod +x $tmpMapFile && echo $tmpMapFile)
Der Klon sieht so aus:
$ git svn clone -s --authors-prog=$(tmpMapFile="$TMPDIR/mapSvnUsersAutomatically.$$.sh" && echo -e '#!/bin/sh\necho $1" <"$1"@example.com>"' > $tmpMapFile && chmod +x $tmpMapFile && echo $tmpMapFile) https://svn.example.com/svn/repo/
Dies erzwingt, dass alle Mappings genau gleich sind und SVN-Klone könnten “geteilt” und über Git zusammengeführt werden!