Richten Sie git so ein, dass alle Zweige gezogen und geschoben werden


616

Ich möchte standardmäßig alle Zweige verschieben und ziehen, einschließlich der neu erstellten.

Gibt es eine Einstellung, die ich dafür definieren kann?

Was ist der einfachste Weg, wenn ich einen neuen Zweig lokal hinzufüge und ihn vom Server abrufen möchte?

Ich habe einen neuen Zweig mit demselben Namen erstellt und versucht zu ziehen, aber es funktioniert nicht. Fragt mich nach der gesamten Remote-Konfiguration des Zweigs. Wie stelle ich es ein?


4
"und versucht zu ziehen, aber es funktioniert nicht". Details bitte. Zeigen Sie uns, welchen Befehl Sie verwendet haben.
Jakub Narębski

Antworten:


1297

Der einfachste Weg ist:

git push --all origin

Dadurch werden Tags und Zweige verschoben.


10
Unter Dutzenden von Antworten, die ich auf SO und anderen Orten gefunden habe, ist dies die einfachste Möglichkeit, einen neu erstellten lokalen Zweig zu verschieben, ohne die Konfiguration zu berühren. Vielen Dank!
András Szepesházi

174
Und wenn Sie -ueinmal hinzufügen , z. B. git push --all origin -uwird das Tracking eingerichtet und danach können Sie es einfach verwenden git push.
Alec

23
Für Git Version 1.7.12.3 musste ich git push --tags originalle Tags pushen.
Thisgeek

17
Schauen Sie sich auch "--mirror" anstelle von "--all" an, um mehr Zeug zu bekommen
Loda

21
WARNUNG: Wenn Sie eine Reihe von LOCAL-Zweigen haben, die Sie nicht bereinigt haben (Funktionen, Hotfixes) - oder die nicht ordnungsgemäß bereinigt wurden (ich), wird Ihre Fernbedienung überflutet. Verdammt. Und wir haben gerade einen Schnitt gemacht. Ich bin mir nicht sicher, warum mein Einheimischer so viele Filialen übrig hatte.
Jack

147

Mit modernem Git rufen Sie immer alle Zweige ab (als Fernverfolgungszweige in den refs/remotes/origin/*Namespace, sichtbar mit git branch -roder git remote show origin).

Standardmäßig (siehe Dokumentation der push.defaultKonfigurationsvariablen) pushen Sie übereinstimmende Zweige , was bedeutet, dass Sie zuerst tun müssen, damit git push origin branchgit es immer weiter pusht git push.

Wenn Sie immer alle Zweige pushen möchten, können Sie push refspec einrichten. Angenommen, die Fernbedienung heißt origin, können Sie entweder git config verwenden :

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

oder bearbeiten Sie die .git/configDatei direkt, um Folgendes zu erhalten:

[entfernter "Ursprung"]
        url = user@example.com: /srv/git/repo.git
        fetch = + refs / heads / *: refs / remotes / origin / *
        fetch = + refs / tags / *: refs / tags / *
        push = + refs / Heads / *: Refs / Heads / *
        push = + refs / tags / *: refs / tags / *

3
@Merc: git push --all originist gut für die einmalige Veröffentlichung aller Zweige und Tags, obwohl standardmäßig bis zur aktuellen Version "Matching" -Semantik bedeuten würde, dass Sie alle Zweige danach verschieben würden ... es sei denn, Sie fügen einen neuen Zweig oder ein neues Tag hinzu. Die Einstellung zu „push [...] alle Zweige standardmäßig“ als geschrieben.
Jakub Narębski

Sie können die Antwort verbessern, um die Möglichkeit hinzuzufügen, Git auf diese Weise neu zu konfigurieren. Dies ist nützlich für Benutzer, die den einfachen Modus eingestellt haben.
Dereckson

3
Dies hat sich seit Git 2.0 geändert. Der Push-Standard ist einfach und passt nicht mehr zusammen.
Mike

Ich habe dies versucht und beim Push einen Fehler erhalten: fatal: Invalid refspec ''+refs/heads/*:refs/heads/*'' (Hinweis: Ich bin auf Git 2.0. Ich arbeite immer noch daran, wie ich das beheben kann.)
Brian Lacy

2
Nun Standardwert für push.defaultist simple.
Hasanghaforian

32

Das Einfügen des + in die Push-Spezifikation ist wahrscheinlich eine schlechte Idee, da dies bedeutet, dass git auch ohne -f gerne einen Push ohne Vorlauf ausführt . Wenn der Remote-Server so eingerichtet ist, dass er diese akzeptiert, können Sie den Verlauf verlieren.

Versuchen Sie genau das:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'

Sie können --globaljedem dieser Elemente auch die Option hinzufügen , um dies zum globalen Standard für alle Ihre Repositorys zu machen.
Ether

Es ist bedauerlich, dass das + dabei automatisch von git hinzugefügt wird git remote add.
Ether

26

Ich hatte die folgenden Befehle verwendet, um alle Zweige in das neue Repository zu migrieren.

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

HINWEIS : Ich musste beim Klonen eines Repos von Atlassian Stash nach AWS CodeCommit (leeres Repo) den vorletzten Befehl (dh Push Master First ) verwenden. Ich bin mir nicht sicher, warum, aber nach dem Drücken von ( git push new-origin --mirror) bezog sich der Standardzweig auf einen anderen Zweig als master.


1
Perfekt, um ein Repo auf einen anderen Host zu verschieben. Vielen Dank!
Pelmered

2
Dies ist in der Tat nur eine nützliche Methode. Verwenden Sie git push new_origin --alleinfach Ihre aktuellen lokalen Zweige nach new_origin, nicht alle Ursprungszweige.
Yanzi1225627

Nur zu beachten, dass dies ein --bareRepository macht , das sich ein bisschen von einem regulären Repository unterscheidet. Es enthält nur die .gitDateien, nicht Ihre Dateien. Es ist vollkommen genug, wenn Sie nicht daran arbeiten wollen. Siehe --bareund --mirror git-scm.com/docs/git-clone .
jmmut

Obwohl nur die .git-Dateien und nicht der eigentliche Quellcode vorhanden sind, wird bei einem Remote-Update alles vom Ursprung zum Ziel erneut abgerufen.
SanthoshM

Das war ein Lebensretter! Diese "Master vor Spiegel" -Methode behebt das Problem, dass Bitbucket das Ziel ist und glaubt, dass ein anderer Zweig als "Master" der Hauptzweig ist.
Toddius Zho

12

Wenn Sie Zweige von einem alten in ein neues Repo verschieben und NICHT alle alten Repo-Zweige lokal haben, müssen Sie sie zuerst verfolgen.

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

Fügen Sie dann Ihr neues Remote-Repo hinzu:

git remote add bb <path-to-new-repo>

Dann können Sie alle mit diesem Befehl pushen:

git push -u bb --all

Sie können das Repo auch mit den in den anderen Antworten angegebenen Git-Konfigurationsbefehlen konfigurieren, wenn Sie dies nicht einmal tun oder nur lokale Zweige verschieben möchten.

Der wichtige Punkt, die anderen Antworten schieben nur alle lokalen Zweige. Wenn die Zweige nur in einem alternativen REMOTE-Repository vorhanden sind, werden sie nicht verschoben, ohne sie zuvor zu verfolgen. Die hier vorgestellte for-Schleife hilft dabei.


Übrigens verwende ich hier "bb" anstelle von "origin", da ich davon ausgehe, dass Ihr ursprüngliches / altes Repository "origin" heißt und wahrscheinlich immer noch an dieses Label angehängt ist. "bb" ist für Bitbucket, wo ich mein ursprüngliches Repo verschoben habe, aber Sie können es auch als "neworigin" bezeichnen, wenn Sie es vorziehen.
Lance Cleveland

2
Das hat bei mir nicht funktioniert. Endete mit allen entfernten Zweigen, die den gleichen lokalen Zweig verfolgen: /
jhsowter

2
AFAIK das sollte laut @jhsowter Kommentar nicht funktionieren. Der richtige Befehl für mich, einen Remote-Zweig in einem neu geklonten Repo zu verfolgen, ist git branch --track reponame origin/reponameansonsten, dass Sie alle Remote-Zweige auf dem aktuellen lokalen Zweig verfolgen
Pioneer Skies

Ich habe das Repo-Sammel-Snippet in geändert git branch -r | grep -v '\->' | sed 's/ origin\///', das nur den Namen des Remote-Zweigs enthält.
Paul Hicks

6

Um alle Zweige ohne Verwendung zu sehen git branch -a, sollten Sie Folgendes ausführen:

for remote in `git branch -r`; do git branch --track $remote; done
git fetch --all
git pull --all

Jetzt können Sie alle Zweige sehen:

git branch

Um alle Zweige zu schieben, versuchen Sie:

git push --all

1
λ git fetch --all origin fatal: fetch --all nimmt kein Repository-Argument an
foxundermon

versuchst git fetch --alldu es
Tokhi

4

Wenn Sie alle Zweige von einem alten in ein neues Repo verschieben, müssen Sie in Ihrem lokalen Repo die Verfolgung jedes Zweigs zu vorhandenen Ursprungszweigen einrichten, bevor Sie zum neuen Repo wechseln. Andernfalls werden nicht alle Ihre Ursprungszweige angezeigt der neue Ursprung. Tun Sie dies manuell, indem Sie jeden Zweig verfolgen oder auschecken, oder verwenden Sie den einen Liner:

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

Dieser einzeilige Befehl basiert auf Versionen davon in anderen Antworten auf dieser Seite, ist aber wohl besser, weil:

  1. Im Gegensatz zu einigen älteren Varianten dieses Befehls auf dieser Seite, die nur einen Parameter für --track angeben, wird die Verzweigungsverfolgung korrekt eingerichtet, und somit endet jede Verzweigung als Verfolgungsmaster - nicht gut
  2. benennt die lokalen Zweige ohne das Präfix "origin /", das ich persönlich nicht möchte - und stimmt mit dem überein, was passiert, wenn Sie einen Zweig normal auschecken.
  3. überspringt den Tracking-Master, da dies bereits geschieht
  4. checkt eigentlich nichts aus also ist schnell
  5. vermeidet das Stolpern über das -> in der Ausgabe von git branch -r

Wenn Sie den Ursprung wechseln, ersetzen Sie als Nächstes die Verbindung zum alten Ursprung und zeigen Sie auf eine neue Fernbedienung. Stellen Sie sicher, dass Sie zuerst die neue Fernbedienung mithilfe der Bitbucket / Github-Benutzeroberfläche erstellen, aber keine Dateien hinzufügen, da sonst ein Zusammenführungsproblem auftritt. Z.B

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git

Jetzt drücken. Beachten Sie, dass der zweite Befehl erforderlich ist, um auch die Tags zu übertragen:

git push -u --all origin
git push --tags origin

0

Lösung ohne Hardcodierung originin der Konfiguration

Verwenden Sie Folgendes in Ihrer globalen gitconfig

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

Dies schiebt alle Zweige und alle Tags

Warum sollten Sie NICHT originin der Konfiguration fest codieren?

Wenn Sie fest codieren:

  1. Sie werden originin allen Repos als Fernbedienung enden . Sie können also keinen Ursprung hinzufügen, müssen ihn jedoch verwenden set-url.
  2. Wenn ein Tool eine Fernbedienung mit einem anderen Namen erstellt, wird Push All Config nicht angewendet. Dann müssen Sie die Fernbedienung umbenennen, aber das Umbenennen funktioniert nicht, da es originbereits existiert (ab Punkt 1). Denken Sie daran :)

Für das Holen sorgt schon der moderne Git

Nach Jakub Narębskis Antwort:

Mit modernem Git rufen Sie immer alle Zweige ab (als Fernverfolgungszweige in den Namespace refs / remotes / origin / *

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.