Wie konfiguriere ich Git Push so, dass Upstream ohne -u automatisch eingerichtet wird?

96

Ich möchte git push origindie Upstream-Referenz automatisch festlegen, wenn ich zum ersten Mal einen lokal erstellten Zweig pushe.

Ich weiß Bescheid git push -u, aber ich möchte nicht darüber nachdenken müssen, ob ich -uzuvor eine Upstream-Referenz verwendet oder auf andere Weise festgelegt habe. Mit anderen Worten, ich möchte git pushautomatisch die Auswirkung git push -uauf jeden Push eines Zweigs haben, der noch keinen Upstream hat.

Ist das möglich? Wenn ein Alias ​​oder ein Dienstprogramm erforderlich ist, ist das in Ordnung.

John
quelle
2
Haben Sie überprüft, ob es möglich ist, die Optionen push.defaultund branch.<name>.mergein git-config (1) zu verwenden ?
5
Ich habe mich darauf push.defaulteingestellt current- so kann ich nur git push originohne Refspec oder Upstream sagen . Es hilft jedoch nicht, den Upstream automatisch einzustellen.
John

Antworten:

59

Sie können es mit git configusing konfigurieren git config --global push.default current.

Dokumente: https://git-scm.com/docs/git-config/#Documentation/git-config.txt-pushdefault

Andrea Bergonzo
quelle
8
Ich habe dieses Set - so kann ich es einfach git push originohne Refspec oder Upstream sagen . Es hilft jedoch nicht, den Upstream automatisch einzustellen.
John
Funktioniert für mich: +1:
Tim Strijdhorst
Ja, wie @John sagt, ist es wichtig zu bedenken, dass dies nicht dazu führt, dass die lokale Zweigstelle die entfernte verfolgt. Es wird lediglich der Remote-Zweig mit demselben Namen wie der lokale Zweig erstellt.
Waldyrious
Gut genug, wenn Sie nur müssen push, z. B. ist nur ein Entwickler in seiner Filiale, der nur eine Kopie eines Repos bearbeitet.
superarts.org
26

Da ich nicht denke, dass dies mit git config möglich ist, können Sie Folgendes in bash tun:

[[ $(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 er an, git pushandernfalls ruft er an git push -u

mechanischer Fisch
quelle
24
Sie können jetzt tun git config --global push.default current.
Andrea Bergonzo
2
@AndreaBergonzo das ist die einzig gute Antwort für mich, kannst du es als Antwort hinzufügen?
pdem
6
@AndreaBergonzo, @pdem - Beachten Sie, dass push.default=currentim Remote-Repository nur ein Zweig mit demselben Namen wie der lokale Zweig erstellt wird, der lokale Zweig jedoch nicht so eingestellt wird, dass er den Remote-Zweig verfolgt. Ich bin mir nicht sicher, warum dies der Fall ist, aber es lohnt sich, daran zu denken.
Waldyrious
22

Hinweis: Die Tatsache, dass die neue Standard-Push-Richtlinie " simple" von einem Zweig mit einem Upstream-Zweig abhängt, bedeutet Folgendes: Das
Festlegen eines Upstream-Zweigs wird als freiwilliger Schritt angesehen, nicht als versteckter automatisierter Schritt

Wenn " git push [$there]" nicht sagt, was zu pushen ist, haben wir bisher die traditionelle "Matching" -Semantik verwendet (alle Ihre Zweige wurden an die Fernbedienung gesendet, solange dort bereits Zweige mit demselben Namen vorhanden sind).

Wir werden die " simple" Semantik verwenden, die den aktuellen Zweig zu dem Zweig mit demselben Namen verschiebt, nur wenn der aktuelle Zweig so eingestellt ist, dass er in diesen entfernten Zweig integriert wird .
Es gibt eine Konfigurationsvariable für Benutzereinstellungen " push.default", um dies zu ändern.


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

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

git pu origin

Sc0ttyD schlägt in den Kommentaren den folgenden Alias ​​vor:

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'
VonC
quelle
1
Vielen Dank, dass Sie gezeigt haben, wie Sie den Alias ​​einrichten. Ich bin mir jedoch nicht sicher, in welchem ​​Zusammenhang oder in welcher Relevanz der erste Teil Ihrer Antwort steht.
John
2
@ John mein Punkt ist: Sie würden einen Schritt umgehen, der beabsichtigt sein soll. Sie können diesen Alias -ueinrichten , aber ich wollte anderen Lesern klar machen, warum diese explizite Option existiert und warum es keine Konfiguration gibt, um diese Option automatisch zu machen (daher der Alias).
VonC
2
Ich habe eine Liste von zsh-Aliasnamen in meiner .zshrc. Ich habe diese Antwort geändert, um den folgenden zsh-Alias ​​zu erstellen:alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'
Sc0ttyD
2
@ Sc0ttyD Interessant, danke. Ich habe Ihren Kommentar zur besseren Sichtbarkeit in die Antwort aufgenommen.
VonC
17

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

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

Verwendung: git trackeinmal pro neuer Filiale (derzeit ausgecheckt). Dann einfach wie gewohnt drücken :)

Frexuz
quelle
15

Die Antworten von @VonC und @Frexuz sind hilfreich, aber beide Lösungen führen zu einem Fehler für mich. Mit beiden Antworten habe ich etwas zusammengeschustert, das für mich funktioniert:

    [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 dazu, dass entweder git push -u origin $BRANCHNAMEoder ausgeführt wird git push, je nachdem, ob sein Upstream (Eigenschaft branch.$BRANCHNAME.merge) definiert ist.

Für die Eingabe dieses Alias ​​in der Befehlszeile sind Escape-Codes erforderlich. Daher ist es wahrscheinlich am einfachsten, einen Editor zum Einfügen in die richtige Datei ( $HOME/.gitconfig(global), .git/config(lokal) oder /etc/gitconfig(system)) zu verwenden.

Kennzeichen
quelle
3
Dies ist die einfachste und vollständigste Antwort. Um den Standardeditor zu öffnen, ohne nach der Datei zu git config --global -e
suchen
5

Kurze Antwort

Wenn Sie tatsächlich explizit sein und die -uOption bei Bedarf verwenden möchten, aber nicht das Ganze eingeben möchten:

git push -u origin foo

Dann können Sie den folgenden Alias ​​verwenden:

[alias]
    push-u = !git push -u origin $(git symbolic-ref --short HEAD)

Und geben Sie einfach Folgendes ein:

git push-u

Lange Antwort

In der Regel besteht die Notwendigkeit für -u(Abkürzung für --set-upstream) darin, dass wir gerade eine neue lokale Niederlassung erstellt und festgeschrieben haben und diese vorab weiterleiten möchten. Das Remote-Repository verfügt noch nicht über den neuen Zweig. Daher müssen wir git anweisen, den Remote-Zweig zu erstellen und zu verfolgen, bevor wir das Commit ausführen. Dies ist nur für den ersten Druck auf den Zweig erforderlich. Hier ist ein typisches Szenario:

git checkout -b foo         # Create local branch
git commit -m "Foo"         # Create local commit
git push -u origin foo      # Create and track remote branch, and push commit
git commit -m "Bar"         # Create local commit
git push                    # Push commit

Persönlich mag ich die Notwendigkeit, git push -ubeim Erstellen des Remote-Zweigs explizit darauf einzugehen: Es ist ein ziemlich bedeutender Vorgang, der einen ganz neuen Zweig für die Welt freigibt.

Ich hasse es jedoch, dass wir explizit schreiben müssen git push -u origin foo. Das Tippen ist nicht nur schmerzhaft, sondern vor allem auch fehleranfällig! Es ist leicht, bei der Eingabe des Filialnamens einen Fehler zu machen, und die neue Remote-Filiale hat nicht den gleichen Namen wie Ihre lokale Filiale! In den meisten Fällen möchten Sie wirklich, dass das Upstream-Repository originund der Upstream-Zweig denselben Namen wie Ihr lokaler Zweig haben.

Daher verwende ich in meinem folgenden Alias .gitconfig, der eine Teilmenge der hervorragenden Antwort von Mark ist :

[alias]
    push-u = !git push -u origin $(git symbolic-ref --short HEAD)

Jetzt können wir Folgendes tun, was immer noch explizit, aber weniger fehleranfällig ist:

git checkout -b foo         # Create local branch
git commit -m "Foo"         # Create local commit
git push-u                  # Create and track remote branch, and push commit
git commit -m "Bar"         # Create local commit
git push                    # Push commit
Boris Dalstein
quelle
4

Ich habe dieses Problem mit diesem einfachen Bash-Skript gelöst. Es funktioniert nicht für vorhandene Zweige, aber wenn Sie alle Ihre Zweige mit dieser Funktion erstellen, wird Ihr Upstream-Zweig immer automatisch eingestellt.

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

Das $ 1 stellt das erste Argument dar, nach dem Sie übergeben. conEs ist also wie folgt:

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

... indem Sie dies einfach tun:

con my-new-branch
JT Jobe
quelle
2

Einfach:

$ alias gush="git push -u origin HEAD"
Djanowski
quelle
2
Fragetitel: "Wie konfiguriere ich git push so, dass Upstream ohne -u automatisch eingerichtet wird?" Beschreibung: "Ich weiß von git push -u, aber ...". Das beantwortet die Frage also nicht.
John
2
@ John Ich habe meine Antwort aktualisiert, um einen einfachen Alias ​​vorzuschlagen.
Djanowski
2
@ John Beantwortet es die Frage jetzt?
Djanowski
1
@ ILI4SK4RIM Danke, es ist verrückt, dass meine Antwort die einfachste ist, aber es ist -1 ¯_ (ツ) _ / ¯
djanowski
1

Ich habe eine Git-Erweiterung mit nützlichen Skripten erstellt, einschließlich dieser:

usage: git line push

Push the current branch and set an upstream if needed.

https://github.com/jvenezia/git-line

jvenezia
quelle
1

Wenn Sie die integrierten Git-Funktionen nur mit den weniger möglichen Schlüsseln verwenden möchten, geben Sie einfach Folgendes ein:

$ git push -u o tab H tab

und die automatische Vervollständigung wird Ihnen geben $ git push -u origin HEAD

Um die automatische Vervollständigung unter OSX zu aktivieren, richten Sie eine ~/.git-completition.bashDatei mit diesem Inhalt ein, fügen Sie der ~/.bash_profileDatei die folgenden Zeilen hinzu und starten Sie das Terminal neu:

# git branch autocomplete
if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Dies betrifft auch integrierte Terminals wie das in vscode usw.

Gazdagergo
quelle
Autocomplete? Git hat keine automatische Vervollständigung. In Ihre Shell (bash? Zsh?) Wurden eine Reihe von Regeln für die automatische Vervollständigung geladen. Können Sie Informationen darüber bereitstellen, welche Regeln für die automatische Vervollständigung Sie verwenden und wo Sie diese erhalten?
vy32
Oh, in der Tat danke. Ich habe meine Antwort mit meinen Einstellungen für die automatische Vervollständigung abgeschlossen.
Gazdagergo
Ohne den Inhalt Ihrer Datei ~ / .git-vervollständigung.bash zu kennen, ist Ihre Antwort nicht operationalisierbar.
vy32
1
Guter Punkt. Ich fand die Quelle von mir git-completition.bashund fügte meiner Antwort hinzu.
Gazdagergo