2013-07-25 6 views
41

Ich möchte git push origin automatisch die Upstream-Referenz festlegen, wenn ich einen lokal erstellten Zweig zum ersten Mal drücken.Wie konfiguriere ich git push um automatisch upstream ohne -u zu setzen?

Ich weiß über git push -u, aber ich möchte nicht darüber nachdenken müssen, ob ich -u zuvor verwendet habe oder nicht anderweitig eine Upstream-Referenz festlegen. Mit anderen Worten, ich möchte git push automatisch die Wirkung von git push -u auf jeden Push eines Zweigs haben, der nicht bereits einen Upstream hat.

Ist das möglich? Wenn es ein Alias- oder Dienstprogramm-Skript erfordert, ist das in Ordnung.

+1

Haben Sie überprüft, ob es möglich ist, die 'push.default' und' Zweig zu verwenden. .merge Optionen in [git-config (1)] (https://www.kernel.org/pub/software/scm/git/docs/git-config.html)? –

+0

Ich habe 'push.default' auf' current' gesetzt - so kann ich einfach 'git push origin 'ohne refspec oder upstream sagen. Aber es hilft nicht beim automatischen Einstellen des Upstream. – John

Antwort

20

Da ich nicht glaube, dies möglich ist git config, hier ist das, was Sie in der Bash tun können:

[[ $(git config "branch.$(git rev-parse --abbrev-ref HEAD).merge") = '' ]] && git push -u || git push 

Wenn der aktuelle Zweig einen Remote-Tracking-Zweig hat, ruft sie git push sonst nennt es git push -u

+1

Sie können jetzt 'git config --global push.default current'. –

16

Anmerkung: die Tatsache, dass die new default push policy "simple" auf einem Zweig setzt eine stromaufwärtige eine mit bedeutet:
ein stromaufwärtiges Zweigeinstellung als freiwilligen Schritt betrachtet wird, kein automatisiertes Verborgene

Wenn „git push [$there]“ sagt nicht, was, schieben wir die traditionelle verwendet haben „passende“ Semantik bisher (alle Zweige der Fernbedienung so lange gesendet wurden, wie es bereits Zweige des gleichen Namens dort über).

Wir werden die „simple“ Semantik verwenden, die den aktuellen Zweig zu dem Zweig mit dem gleichen Namen, nur, wenn der aktuelle Zweig ist auf der Integration mit diesem entfernten Zweig schiebt.
Es gibt eine Konfigurationsvariable für Benutzereinstellungen "push.default", um dies zu ändern.


So Aufbau von mechanicalfish ‚s answer, können Sie eine Alias, mit den richtigen doppelten Anführungszeichen (") entkam (\") definieren:

git config alias.pu "![[ $(git config \"branch.$(git rev-parse --abbrev-ref HEAD).merge\") = '' ]] && git push -u || git push" 

git pu origin 

Sc0ttyD schlagen in the comments der folgende Alias:

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push' 

In mehreren Zeilen:

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && 
      git push -u origin $(git symbolic-ref --short HEAD) || 
      git push' 
+0

Vielen Dank für die Einrichtung des Alias. Ich bin mir jedoch nicht klar über die Verbindung oder die Relevanz des ersten Teils Ihrer Antwort. – John

+1

@John mein Punkt ist: Sie würden einen Schritt umgehen, der beabsichtigt sein sollte. Sie können diesen Alias ​​einrichten, aber ich wollte anderen Lesern klar machen, warum diese explizite "-u" -Option existiert und warum es keine Config gibt, um diese Option automatisch zu machen (daher der Alias). – VonC

+0

Ich habe eine Liste von Zsh Aliase in meiner .zshrc. Ich habe diese Antwort modifiziert, um den folgenden zsh alias zu erstellen: 'alias gpu = '[-z $ (git config" Zweig. $ (Git symbolic-ref - Kurzkopf) .merge ")]] && git push -u Herkunft $ (git symbolic-ref - Kurzkopf) || git push'' – Sc0ttyD

10

Ich hatte das gleiche Problem haben. Ich habe diesen Alias ​​(.gitconfig) gefunden

[alias] track = "!git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`"

Verbrauch: git track einmal pro Niederlassung (derzeit ausgecheckt). Dann einfach normal drücken :)

8

Die Antworten von @VonC und @Frexuz sind hilfreich, aber beide Lösungen erzeugen einen Fehler für mich.Mit ihren beiden Antworten, gepflasterten ich zusammen etwas, das funktioniert für mich:

[alias] 
    pu = ![[ $(git config "branch.$(git symbolic-ref --short HEAD).merge") = '' ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push 

Dies führt bei der Ausführung entweder git push -u origin $BRANCHNAME oder git push, je nachdem, ob seine Upstream (Eigenschaft branch.$BRANCHNAME.merge) definiert.

Eingabe dieses Alias ​​in der Befehlszeile wird Escape-Codes erforderlich ist, so ist es wahrscheinlich am einfachsten mit einem Editor zu verwenden, in die richtige Datei einzufügen ($HOME/.gitconfig (global), .git/config (lokal) oder /etc/gitconfig (System))

+2

Dies ist die einfachste und vollständigste Antwort. Um den Standard-Editor zu öffnen, ohne nach der Datei zu suchen, können Sie 'git config --global -e' –

-1

einfach:

$ alias gush="git push -u origin HEAD" 
+0

Fragetitel:" Wie konfiguriere ich git push um automatisch upstream ohne -u zu setzen? " Beschreibung: "Ich weiß über' git push -u', aber ... ". Das beantwortet also die Frage nicht. – John

+1

@John Ich aktualisierte meine Antwort, um einen einfachen Alias ​​vorzuschlagen. – djanowski

+1

@John Beantwortet es jetzt die Frage? – djanowski

1

Ich löste dieses Problem mit diesem einfachen Bash-Skript. Es funktioniert nicht mit vorhandenen Zweigen, aber wenn Sie alle Zweige mit dieser Funktion erstellen, wird Ihre Upstream-Verzweigung immer automatisch gesetzt.

function con { git checkout -b $1 && git push --set-upstream origin $1; } 

Der $ 1 ist das erste Argument, das man nach con geben, so ist es wie zu tun:

git checkout -b my-new-branch && git push -u my-new-branch 

... durch diese gerade tun:

con my-new-branch 
0
git fetch origin 
git push origin 

^dies setzt den Upstream für mich

Verwandte Themen