Frage

Wir sind mit git-svn Zweige eines SVN-Repo zu verwalten. Wir stehen vor folgendes Problem: Nach einer Reihe von Commits von Benutzer X in der Branche, Benutzer Y möchte git-svn verwenden, um die Änderungen im Zweig mit dem Stamm zu verschmelzen. Das Problem, das wir sehen, sind, dass die Commit-Nachrichten für alle einzelnen Verschmelzungsoperationen aussehen, als ob sie durch den Benutzer Y gemacht wurden, während die tatsächliche Änderung in der Niederlassung von Benutzern X gemacht wurde.

Gibt es eine Möglichkeit, um anzuzeigen, git-svn, dass beim Zusammenführen, verwenden Sie die ursprüngliche Nachricht / Autor für eine gegebene Änderung begehen, anstatt die Person, die Zusammenführung zu tun?

War es hilfreich?

Lösung

Der git-svn Manpage empfiehlt, nicht merge verwenden . „“ Es wird empfohlen, dass Sie laufen git-svn holen und rebase (nicht ziehen oder zusammenführen) „“. Having said that, können Sie tun, was Sie wollen: -)

Es gibt zwei Probleme hier. Erste ist, dass svn nur speichert den commiter , nicht den Autor eines Pflasters als git tut. Also, wenn Y die verschmilzt mit dem Stamm verpflichtet, svn nur ihren Namen aufzeichnet, auch wenn die Patches von X. verfasst wurden Dies ist ein erstaunlich Merkmal git, erstaunlich einfache, aber lebenswichtig für Open-Source-Projekte Änderungen wurden zuschreibt den Autor kann rechtliche Probleme auf dem Weg vermeiden.

Zum anderen git scheint nicht die relativ neue SVN-Funktionen verschmelzen zu verwenden. Dies kann eine vorübergehende Sache sein, wie git aktiv weiterentwickelt wird und neue Features werden ständig hinzugefügt. Aber jetzt ist es nicht sie verwenden.

Ich habe gerade mit git 1.6.0.2 versucht und es „verliert“ Informationen im Vergleich zu dem gleichen Vorgang mit svn merge zu tun. In SVN 1.5 wurde eine neue Funktion für die Protokollierung und Annotation Methoden hinzugefügt, so dass SVN auf dem Stamm ausgeben würde log -g so etwas wie dies für eine Zusammenführung:

------------------------------------------------------------------------
r5 | Y | 2008-09-24 15:17:12 +0200 (Wed, 24 Sep 2008) | 1 line

Merged release-1.0 into trunk
------------------------------------------------------------------------
r4 | X | 2008-09-24 15:16:13 +0200 (Wed, 24 Sep 2008) | 1 line
Merged via: r5

Return 1
------------------------------------------------------------------------
r3 | X | 2008-09-24 15:15:48 +0200 (Wed, 24 Sep 2008) | 2 lines
Merged via: r5

Create a branch

Hier Y verpflichtet R 5, die die Änderungen von X auf dem Zweig in den Stamm integriert. Das Format des Protokolls ist nicht wirklich so toll, aber es kommt in seine eigenen auf svn blame -g:

       2          Y int main()
       2          Y {
G      4          X   return 1;
       2          Y }

Hier unter der Annahme, Y nur mit dem Stamm verpflichtet, können wir sehen, dass eine Zeile von X (auf dem Zweig) editierte wurde und zusammengeführt werden.

Wenn Sie also SVN 1.5.2 verwenden, sind Sie möglicherweise besser mit dem realen SVN-Client für jetzt die Verschmelzung. Obwohl Sie Informationen in git fusionieren würden verlieren, ist es in der Regel klug genug, nicht zu beschweren.

Update: Ich habe das gerade versucht, mit git 1.7.1, um zu sehen, ob es irgendwelche Fortschritte in der Zwischenzeit war. Die schlechte Nachricht ist, dass immer noch bevölkern nicht die SVN innerhalb git merge: mergeinfo Werte, so git merge von git svn dcommit gefolgt wird svn nicht gesetzt: mergeinfo und Sie verlieren Informationen zusammenführen, wenn das Subversion-Repository die kanonische Quelle ist, die es wahrscheinlich. Die gute Nachricht ist, dass git svn clone ist in svn lesen. Mergeinfo Eigenschaften besser zu konstruieren Geschichte verschmelzen, wenn Sie also svn merge verwenden richtig (es verschmelzenden volle Zweige erfordert), dann die git Klon korrekt aussehen Benutzer git

Andere Tipps

Sie können Transplantate git über verschmilzt zu lehren, die nicht in dem Commit-Objekt in Frage bezeichnet werden.

echo "$merge_sha1 $parent1_sha1 $parent2_sha1" >> .git/info/grafts

diese Informationen zu finden, ist einfach genug: Da finden die Zusammenführung in Frage begehen, wissen Sie $merge_sha1 und $parent1_sha1 bereits. Herkömmlicherweise wird eine der Commit-Nachricht eines solchen begehen die SVN-Revisionsnummer des zweiten Elternteils enthalten verpflichten, die Sie einfach auf die ID entsprechend übersetzen begehen:

git svn find-rev r$revnum $branch

Presto, haben Sie alle drei Stücke von Informationen, die Sie das Transplantat erstellen müssen.

Versuchen Sie, die --add-Autor-verwenden und --use-log-Autor Optionen zu git-svn.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top