Frage

Ich arbeite an einem Web-Site-Projekt, das zur Zeit in svn verfolgt wird, aber wird ich git bewegen, sobald jemand andere Zeit hat einen neuen Server und Sachen einzurichten. Es ist eine lange Geschichte, aber in der Zwischenzeit habe ich meine eigenen Git-Repository von einem Code, den ich gemacht hatte, und arbeitete an es eine ganze Menge. Ich habe nicht git svn clone verwenden, weil ich im Ausland bin und meine Internet-Verbindung ist seltsam und erfordert einen Proxy für HTTP, und es scheint nicht git svn durch zu lassen. Auf jeden Fall habe ich in meinem eigenen Git-Repository entwickelt, aber schließlich, wenn das Projekt richtig importiert tatsächlich bekommt werde ich brauche, um meine Arbeit auf die git-svn geklont Sachen rebase. git rebase wird die Arbeit richtig für das?

Eine Komplikation ist, dass ich tatsächlich in einer virtuellen Maschine zu arbeiten und für viele Commits hatte ich nicht bemerkt, dass ich nicht die user.name und user.email Konfigurationseinträge gesetzt hatte, so dass die Commits aus dem vm des lokalen Benutzers sind, das ist irgendwie komisch. Wäre es besser, nur alle meine Änderungen in diff-Dateien zu sammeln und sie dann auf der neuen Niederlassung beantragen, sobald sie erstellt wird?

Eine weitere Komplikation ist, dass die SVN zu verwenden, bevor waren irgendwie halbherzig, so gab es eigentlich unbestätigte Änderungen auf dem Produktionsserver, die ich nicht habe. Eigentlich hatte ich eine ältere Revision des Codes in erster Linie, dass nicht einmal der SVN Kopf war, so war ich ein paar Sachen obendrein fehle. Was ist der beste Weg, um fortzufahren?

Eine letzte Frage ist, dass, wenn ich die SVN-Repository über git svn tun importieren (ich gerade überprüft, und es scheint zu funktionieren jetzt), aber ich füge keine Autoren-Datei, werde ich später in der Lage sein, meine Änderungen rebase auf ein richtig importiert Zweig mit einer Autoren-Datei?

Oh, eine neue Komplikation. Ich importierte den SVN-Repository selbst git svn verwenden, einen anstrengenden Prozess, der auf dieser langsamen Verbindung den besseren Teil von zwei Tagen nahm. Nachdem jedoch schließlich den Klon Finishing, erkannte ich, dass im SVN-Repository der Code alle in einem Unterverzeichnis war, aber in meinem Git Repository die Wurzel des Repository war auch die Wurzel des Verzeichnisses. Wenn dies ein wenig verwirrend ist, ist es im Grunde wie folgt

SVN:

\dir\codez

git:

\codez

Wie kann ich kombinieren die beiden Repositories? Ich hoffe, dass ich noch rebase verwenden kann, aber dies scheint wie eine wirklich seltsame Situation. Es klingt ähnlich wie Submodule, aber ich glaube nicht, das ist ganz das, was ich brauche.

War es hilfreich?

Lösung

  

Ich habe nicht git svn clone verwenden, weil ich im Ausland bin und meine Internet-Verbindung ist seltsam und erfordert einen Proxy für HTTP

Es sollte funktionieren, wenn Sie

http_proxy=http://username:passwword@pprroxyHost:proxyPort

oder Sie können versuchen

http_proxyUser=username
http_proxyPassword=password
http_proxyHost=aProxyHost
http_proxyPort=aProxyPort
  

Git Arbeit richtig für diese rebase?

Allgemeine Antwort. Ja, weil Sie nicht Ihren Git-Zweigs veröffentlicht noch
Detaillierte Antwort: Sie müssen zuerst auf Ihrer Branche rebase, bevor das Ergebnis auf dem Master-Zusammenführung. Siehe diese Antwort .
Dies ist die bevorzugte Workflow, da es Ihnen ermöglicht, in einen Konflikt zu lösen Ihr Zweig vor der Verschmelzung (oder Rebasing, wenn Sie Ihre Geschichte behalten wollen) Ihre Branche auf Master.
Eigentlich werden Sie unten sehen, dass eine spezielle „merge“ Zweig zu schaffen ist eigentlich eine bessere Idee.

  

hatte nicht bemerkt, dass ich nicht die user.name und user.email Konfigurationseinträge gesetzt hatte,

Da Sie noch nicht veröffentlicht, können Sie eine filter-branch verwenden, um Ihre Commits zu ändern und den Benutzernamen und E-Mail

Ein wenig sh Skript kann helfen

#!/bin/sh

git filter-branch --env-filter '

n=$GIT_AUTHOR_NAME
m=$GIT_AUTHOR_EMAIL

case ${GIT_AUTHOR_NAME} in
        aSystemUserName) n="TheActual Name" ; m="TheActual@mailAddress" ;;
esac

export GIT_AUTHOR_NAME="$n"
export GIT_AUTHOR_EMAIL="$m"
export GIT_COMMITTER_NAME="$n"
export GIT_COMMITTER_EMAIL="$m"
'

nennen dieses Skript von Ihrem Repo und Ihre fertig sind.

  

Ich hatte eine ältere Version des Codes in erster Linie, dass nicht einmal der SVN Kopf war, so war ich ein paar Sachen obendrein fehle. Was ist der beste Weg, um fortzufahren?

Der grundlegende Arbeitsablauf in diesem Fall ist einen neuen „merge“ Zweig von Ihrem aktuellen Arbeitszweig zu schaffen, um das Fütterungsmaterial Aufwand zu isolieren (und löst alle Konflikte)
In dieser Art von Merge, wo das Delta wichtig ist, müssen Sie Ihre Arbeits astrein aus allen Änderungen halten müssen Sie machen, um enthalten:

  • Sie den Code aus dem SVN
  • Sie den Code nicht direkt aus dem SVN-Repository erhalten hat.
  

werde ich später in der Lage sein, meine Änderungen auf einen ordnungsgemäß importiert Zweig mit einer Autoren-Datei rebase?

Ich bin nicht sicher, aber ich denke schon. Wenn nicht, solange man noch nichts veröffentlicht haben, möchten Sie vielleicht wieder ein filter-branch Umbenennungs Skript verwenden ...

Andere Tipps

git-rebase hängt eine gemeinsame begehen irgendwo in der Geschichte zu müssen. Es kommt auch in einem einzigen Repository. Es klingt wie Sie in einer Situation, um am Ende gehen, in dem (a) die neue git-svn importiert Repo von Ihnen getrennt ist, und (b) es wird keine gemeinsamen Commits zwischen den beiden sein. Sie werden wahrscheinlich über Patches, dies zu tun am Ende brauchen, aber git können Ihnen dabei helfen. Schauen Sie sich den Manpages für git-format-patch und git-am aus. Die erste, eine Reihe von Patches aus einer Reihe von Commits erzeugen kann, und die zweite dieser Reihe von Patches nehmen und wenden sie -. Und die alle Nachrichten begehen und so bleiben erhalten

Dies wird Ihnen die Gelegenheit bieten, Ihre user.name/email Problem zu beheben - Sie sie einfach in den Headern der Patches ändern können, und stellen Sie sicher, dass sie richtig in der neuen importierten Repo festlegen, bevor Sie Ihre Patches anwenden!

Die beste Art und Weise mit Ihrer veralten zu beschäftigen Startplatz ( „ältere Version ... das war nicht einmal der SVN Kopf“) wird wahrscheinlich sein werden:

  • erhalten die SVN-Repo in einem guten Zustand, mit allen Änderungen verpflichtet
  • importiert es mit git-svn
  • erstellen und eine Niederlassung in einem alten Check-out begehen, wo Sie zu arbeiten begann
  • übernehmen Sie die Patch-Serie
  • fusioniert diesen Zweig in dem Master, auf den aktuellen SVN Kopf entspricht

für mich zum Glück aber weniger für Dich habe ich nie zu verwenden git-svn benötigt, so kann ich nicht Ihre Autoren-Datei Frage endgültig beantworten. Allerdings, wenn ich richtig verstehe, die Autoren-Datei übersetzt SVN Autoren in git Autoren. Wenn ein Autor die Änderungen auf einem git commit, wird der Hash ändern. Es wäre daher nicht zu Chaos mit dieser Übersetzungstabelle, und bekommt es gleich beim ersten Mal wichtig sein.

Es gibt eine Menge von Fragen in einem waren hier, so fühlen sich frei, um mehr zu kommentieren und fragen, ob ich die Dinge verpasst.

Sie können neue erstellen ungeborenen Zweig mit Low-Level-Tools:

$ git symbolic-ref HEAD refs/heads/new_branch

Mit modernen git können Sie ganzen Zweig rebase von --root Option "git rebase" verwendet wird.

Das könnte oder auch nicht, in Ihrer Situation helfen. YMMV.

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