Ich arbeite mit git-svn
dem zentralen Subversion-Repository meines Unternehmens. Wir haben kürzlich einen neuen Feature-Zweig im zentralen Repo erstellt.
Wie erzähle ich Git davon? Wenn ich starte, git branch -r
kann ich nur die Zweige sehen, die vorhanden waren, als ich fetch
gegen das Subversion-Repo lief, um mein Git-Repo zu initialisieren.
Antworten:
Sie können den Remote-Zweig manuell hinzufügen.
quelle
fatal: Cannot setup tracking information; starting point 'newbranch' is not a branch.
zum Git-Checkout-Schritt.Wenn Sie ALLE Remote-SVN-Zweige verfolgen möchten, ist die Lösung so einfach wie:
Dadurch werden ALLE Remote-Zweige abgerufen, die noch nicht abgerufen wurden.
Zusätzlicher Tipp: Wenn Sie zuerst nur den Trunk ausgecheckt haben und später ALLE Zweige verfolgen möchten, bearbeiten Sie ihn
.git/config
wie folgt und führen Sie ihn erneut ausgit svn fetch
:Die wichtigsten Punkte sind
url
sollten in das Repository Fußpunkt und die Pfade definiertfetch
undbranches
sollte relativ seinurl
.Wenn Sie nur bestimmte Zweige anstelle von ALL abrufen möchten, finden Sie ein schönes Beispiel in
git svn --help
:Bei älteren Versionen von
git-svn
können Sie nach Angabe solcher Zweige möglicherweise keine neuen Zweige mehr erhaltengit svn fetch
. Eine Problemumgehung besteht darin, weiterefetch
Zeilen wie folgt hinzuzufügen :Eine weitere Problemumgehung von @AndyEstes: Bearbeiten
.git/svn/.metadata
und ändern Sie den Wert vonbranches-maxRev
odertags-maxRev
in eine Revision, bevor neu angegebene Zweige oder Tags erstellt wurden. Führen Sie anschließendgit svn fetch
den neuen SVN-Remote-Zweig aus , um ihn zu verfolgen.quelle
.git/svn/.metadata
war sehr hilfreich! Ich habe zusätzliche Zweige in meinen hinzugefügt.git/config
, diegit svn fetch
nicht aufgegriffen wurden - weil die Versionsnummer der Metadaten "zu weit voraus" war. In einem Fall wurde nur das letzte Commit von einem Zweig abgerufen. Ich habe den fehlerhaften Zweig manuell entfernt (umbenannt.git/svn/refs/remotes/svn/qa/XYZ
in.git/svn/refs/remotes/svn/qa/XYZ~
, hat seine Existenz gelöscht.git/packed-refs
usw.) ... habe eine "frühere" Revisionsnummer für die Metadaten ausgewählt ... lief,git svn fetch
um endlich einen vollständigen Verlauf mit korrektem, verbundenem Diagramm zu erhalten.git svn fetch --all
.Es scheint, ich musste es nur tun
git svn fetch
; Irgendwie hatte ich mich davon überzeugt, dass das gesamte Repo statt nur der Änderungen abgerufen werden würde.quelle
Vielleicht habe ich es irgendwie vermasselt, aber ich habe die Anweisungen in Vjangus 'Antwort befolgt und es hat fast funktioniert. Das einzige Problem war, dass Newbranch nicht vom Stamm abgezweigt zu sein schien. In gitk war es eine Art "Schweben" für sich allein; es hatte keinen gemeinsamen Vorfahren mit dem Stamm.
Die Lösung dafür war:
git diff-tree <sha1 from step 1> <sha1 from step 2>
- Es sollte keine Ausgabe erfolgen. Wenn eine Ausgabe erfolgt, haben Sie möglicherweise die falschen Commits ausgewählt.git checkout local-newbranch
danngit rebase <sha1 from step 1>
. Dies wirdlocal-newbranch
auf den neuen Baum zurückgesetzt, aberremotes/newbranch
immer noch getrennt..git/refs/remotes/newbranch
und bearbeiten Sie sie so, dass sie den vollständigen SHA1 des neuen Commits (auf dem neu basiertennewbranch
) enthält, der dem alten Commit entspricht, auf das er gerade zeigt. (Oder vielleicht verwendengit-update-ref refs/remotes/newbranch <new-SHA>
. Danke Inger.)git svn dcommit
dazu kommennewbranch
, erhalten Sie eine Reihe von Nachrichten darüber, wie Sie ein Protokoll aktualisieren. Das ist normal, denke ich.Ich empfehle,
gitk --all
die ganze Zeit offen zu bleiben und es häufig zu aktualisieren, um zu verfolgen, was Sie tun. Ich bin noch ein bisschen neu bei git und git svn, also schlagen Sie bitte Verbesserungen für diese Methode vor.quelle
Eine Vereinfachung der Antwort von Vjangus:
Wenn Sie das Standardlayout in SVN verwenden und den üblichen svn-Init ausgeführt haben, übernimmt git-svn die Konfiguration für Sie. Gerade:
Ein Beispiel. SVN URL ist
svn+ssh://[email protected]/repo
. SVN-Zweig, den ich suche, istnewbranch
. Lokaler Git-Zweig (Tracking-Fernbedienungnewbranch
) wird seingit-newbranch
.Schritt 1: Suchen Sie die Zweigkopie-Revision
Der Verzweigungspunkt in SVN ist also Revision 7802.
Schritt 2: Holen Sie sich die Revision
git-svn hat die ganze Arbeit gemacht und weiß jetzt über die Fernbedienung Bescheid:
Schritt 3: Erstellen Sie Ihren neuen lokalen Zweig, der den entfernten Zweig verfolgt:
quelle
show-ref
ist von unschätzbarem Wert)! Für alle, die nicht in der Lage sind, Remote-Zweige falsch zu referenzieren, können Sie diese löschen (ich musste das Referenzverzeichnisgit branch -d newbranch
entfernen und dann erzwingen.git/svn/refs/remotes/newbranch
) und dann bei Schritt 2 (oben) von vorne beginnen.Ich habe keine Dokumentation zu dieser Funktion gefunden, aber es sieht so aus, als ob die git svn-Konfiguration mehrere Abrufeinträge unterstützt. Auf diese Weise können Sie Zweige auch separat hinzufügen, ohne dass Sie Ihrer Konfiguration einen weiteren Remote-SVN-Repository-Eintrag hinzufügen oder Platzhalter verwenden müssen, um alle Zweige eines bestimmten Verzeichnisses abzurufen.
Angenommen, Ihr SVN-Baum ist wirklich böse und hat viele Verzweigungen ohne Logik, wie sie sich befinden, z. B. Verzweigungen und Unterverzeichnisse mit mehr Verzweigungen.
dh
und Sie möchten nur einige der Zweige auswählen, die in Ihr Git-Repository aufgenommen werden sollen.
Sie können Ihr Repository zunächst nur mit Trunk ohne zusätzliche Zweige starten:
Danach sollten Sie folgende Konfiguration sehen:
Wann immer Sie einen neuen Zweig von MyRepo abrufen möchten, können Sie der Konfiguration einfach neue Abrufeinträge hinzufügen, indem Sie:
Oder Sie können dieselbe Konfiguration in .git / config bearbeiten
Um die neuen Zweige nach dem Hinzufügen zur Konfiguration abzurufen, führen Sie einfach Folgendes aus:
[Bearbeiten] Manchmal scheint es notwendig zu sein, fetch mit dem Parameter --all auszuführen, um neu hinzugefügte Zweige abzurufen:
quelle
Anstatt sich mit den Macken von git-svn zu befassen, können Sie SubGit ausprobieren .
Man muss SubGit im Subversion-Repository installieren. Danach kann man den Standard-Git-Workflow verwenden, anstatt spezielle git-svn-Befehle zu verwenden:
Neue Commits vorantreiben:
git-svn:
SubGit:
Eingehende Änderungen abrufen
git-svn:
SubGit:
Neuen Zweig erstellen:
git-svn:
SubGit:
Weitere Informationen finden Sie in der SubGit-Dokumentation .
quelle
Um die Antwort von vjangus zu ergänzen, die mir geholfen hat, fand ich es auch nützlich, Git-Transplantate hinzuzufügen, um die Zweige an der entsprechenden Stelle an den Stamm zu binden - damit Git den Verlauf sehen und Zusammenführungen korrekt durchführen kann.
Dies ist einfach ein Fall des Hinzufügens einer Zeile
.git/info/grafts
mit den Hashes:z.B.
Gutschrift an http://evan-tech.livejournal.com/255341.html
(Ich würde dies als Kommentar hinzufügen, aber ich habe nicht genug Ruf.)
quelle
Wenn Sie nicht mit einem gültigen Layout auschecken, können Sie keinen Remote-Zweig auschecken.
Das ist was ich mache:
Danach können Sie zu einem Remote-Zweig wechseln:
Dann werden Sie automatisch zu Ihrer Filiale gewechselt.
quelle