Wenn es ein Repository gibt, auf das ich nur git://
Zugriff habe (und das normalerweise nur Push + Pull ist), gibt es eine Möglichkeit, Zweige in diesem Repository auf die gleiche Weise umzubenennen, wie ich es lokal tun würde git branch -m
?
407
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
.Antworten:
Sie müssen nur einen neuen lokalen Zweig mit dem gewünschten Namen erstellen, ihn auf Ihre Fernbedienung übertragen und dann den alten Fernzweig löschen:
Um den alten Zweigstellennamen zu sehen, müsste jeder Client des Repositorys Folgendes tun:
HINWEIS: Wenn Ihr alter Zweig Ihr Hauptzweig ist, sollten Sie Ihre Einstellungen für den Hauptzweig ändern. Andernfalls wird beim Ausführen
$ git push origin :old-branch-name
die Fehlermeldung "Löschen des aktuellen Zweigs verboten" angezeigt .quelle
git fetch origin --prune
(um die neuen Zweige effektiv abzurufen und auch die Referenzen zu entfernen, die nicht mehr auf der Fernbedienung vorhanden sind).-d
oder--delete
anstelle von:
in neueren Versionen von Git verwenden.Wenn Sie Zweige wirklich nur remote umbenennen möchten, ohne gleichzeitig lokale Zweige umzubenennen , können Sie dies mit einem einzigen Befehl tun:
Ich habe dieses Skript ( git-rename-remote-branch ) geschrieben, das eine praktische Verknüpfung bietet, um die oben genannten Aufgaben einfach auszuführen.
Als Bash-Funktion:
So integrieren Sie den Kommentar von @ ksrb : Grundsätzlich werden zwei Pushs in einem einzigen Befehl ausgeführt, um zuerst
git push <remote> <remote>/<old_name>:refs/heads/<new_name>
einen neuen Remote-Zweig basierend auf dem alten Remote-Tracking-Zweig zu pushen und danngit push <remote> :<old_name>
den alten Remote-Zweig zu löschen.quelle
git push <remote>/<old_name>:refs/heads/<new_name>
eine neue Fernbedienung drücken, die die alte Fernbedienung als src verwendet, und danngit push [space]:<old_name>
die alte Fernbedienung löschenrefs/heads/name
? Können Sie nicht einfachname
direkt den ersten Befehl ausführengit push <remote> <remote>/<old_name>:<new_name>
?<new_name>
noch nicht vorhanden ist. Wenn der Zweig nicht vorhanden ist, müssen Sie bei Git den vollständigen Namen verwenden, da er sich sonst<new_name>
auch auf einen Tag-Namen beziehen könnte.refs/heads/<new_name>
bereits vorhanden ist. Das Löschen ist weiterhin erfolgreich und wird<remote>/<old_name>
nur gelöscht. Einige Überprüfungen vor der Hand können dies leicht vermeiden.Erste Kasse zu dem Zweig, den Sie umbenennen möchten:
So entfernen Sie einen alten Zweig aus
remote
:quelle
git push -u origin new_branch
). Andernfalls verfolgt der umbenannte Zweig (new_branch) weiterhin den Ursprung / old_branch. Und sobald Sie die entfernte alte_Zweige löschen, verfolgt die neue_Zweig weiterhin den Ursprung / die alte_Zweigstelle, obwohl dieser Zweig jetzt weg ist.Sicher. Benennen Sie den Zweig einfach lokal um, verschieben Sie den neuen Zweig und löschen Sie den alten.
Das einzige wirkliche Problem ist, dass andere Benutzer des Repositorys keine lokalen Tracking-Zweige umbenennen.
quelle
TL; DR
Das "Umbenennen" eines Remote-Zweigs ist eigentlich ein zweistufiger Prozess (nicht unbedingt bestellt):
git push [space]:<old_name>
wie ksrb erklärt );Löschen
Ich benutze TortoiseGit und als ich zum ersten Mal versuchte, den Zweig über die Befehlszeile zu löschen, bekam ich Folgendes:
Dies war wahrscheinlich darauf zurückzuführen, dass bei einem Festzug der private Schlüssel nicht geladen war (den TortoiseGit automatisch in den Festzug lädt ). Außerdem ist mir aufgefallen, dass TortoiseGit- Befehle nicht den
origin
Ref enthalten (zgit.exe push --progress "my_project" interesting_local:interesting
. B. ).Ich verwende auch Bitbucket und konnte als andere webbasierte Online-Git-Manager dieser Art (GitHub, GitLab) den Remote-Zweig direkt über die Benutzeroberfläche (Zweig-Seite) löschen:
In TortoiseGit können Sie jedoch auch entfernte Zweige über Verweise durchsuchen löschen :
Mit einem Rechtsklick auf einer entfernten Zweig (Fernbedienungen Liste) die Delete Remotezweig Option zeigt nach oben:
Schieben
Nach dem Löschen des alten Remote-Zweigs habe ich über TortoiseGit direkt in einen neuen Remote-Zweig verschoben, indem ich den neuen Namen in das Feld Remote: des Push- Fensters eingegeben habe . Dieser Zweig wurde automatisch erstellt und in Bitbucket angezeigt .
Wenn Sie es dennoch lieber manuell machen möchten, ist ein Punkt, der in diesem Thread noch nicht erwähnt wurde,
-u
=--set-upstream
.Von
git push
docs ,-u
ist nur ein Alias--set-upstream
, so dass die Befehle in den Antworten von Sylvain (-set-upstream new-branch
) und Shashank (-u origin new_branch
) äquivalent sind, da die Remote - ref standardmäßigorigin
, wenn keine andere ref vorher definiert wurden:git push origin -u new_branch
=git push -u new_branch
aus der Dokumentbeschreibung :Am Ende habe ich keinen der Befehle, die in den anderen Antworten hier vorgeschlagen wurden, manuell eingegeben oder verwendet, sodass dies in einer ähnlichen Situation möglicherweise für andere nützlich sein könnte.
quelle
origin
. Sie müssen Ihre Fernbedienung benennen, wenn Sie den Befehl ausführengit remote
. Git arbeitet mit dem,ssh
was impliziert, dass Sie öffentliche + private Schlüssel verwenden. IchAutoload Putty keys
gehe davon aus, dass TortoiseGit nur die erforderlichen Schlüssel automatisch lädt, damit Sie mit Ihrer Fernreferenz überhaupt etwas tun können. Das Letzte ist, dassgit push -u
es sich nicht um einen Alias zum Verschieben in einen Remote-Zweig handelt, sondern um einen Alias zum Verschieben in einen Remote-Zweig , der lokal erstellt wurde und dessen Remote-Referenz diesen Zweig noch nicht hat .-u
ist ein Alias von--set-upstream
und "Wenn die Konfiguration fehlt, wird standardmäßigorigin
" verwendet. Sylvain und Shashank verwenden dies, um in einen neu erstellten Remote-Zweig zu gelangen . Der Schlüssel Problem möglicherweise aufgrund gewesen Festzug nicht mit dem Laden , als ich versuchte ,git push origin :in
auf der Schale. Damit ich Ihre Ablehnung nicht verstehe, habe ich in anderen Antworten nur auf meine und nicht angesprochenen Details hingewiesen, sie erklärt und gelöst.-u
ist ein Alias für,--set-upstream
aber das ist kein Alias für das Verschieben in einen Remote-Zweig, wie Sie sagten. Um in einen Remote-Zweig zu pushen, den Sie eindeutig benötigengit push <remote>
, und wenn er sich noch nicht in der Remote befindet, fügen Sie hinzugit push -u <remote>
. Wird-u
daher verwendet, um eine Referenz des Zweigs in der Fernbedienung zu erstellen.Ich weiß nicht warum, aber die Antwort von @Sylvain Defresne funktioniert bei mir nicht.
Ich muss den Upstream deaktivieren und dann kann ich den Stream wieder einstellen. Das Folgende ist, wie ich es gemacht habe.
quelle
Ich weiß nicht, ob dies richtig oder falsch ist, aber ich habe den "alten Namen" des Zweigs in den "neuen Namen" des Zweigs verschoben und dann den alten Zweig vollständig mit den folgenden zwei Zeilen gelöscht:
quelle
Sie können einen neuen Zweig basierend auf einem Zweig mit altem Namen erstellen. Einfach so, dann lösche den alten Zweig, vorbei !!!
quelle
Zusätzlich zu den bereits gegebenen Antworten finden Sie hier eine Version, die zunächst prüft, ob der neue Zweig bereits vorhanden ist (damit Sie ihn sicher in einem Skript verwenden können).
(Der Scheck stammt aus dieser Antwort )
quelle
git show-ref --quiet --verify -- refs/heads/$new_name
statt verwendetls-remote | cut | sed | grep
.