Come configurare git push per impostare automaticamente l'upstream senza -u?


100

Desidero git push originimpostare automaticamente il riferimento a monte quando eseguo il push di un ramo creato localmente per la prima volta.

Lo so git push -u, ma non voglio pensare se ho usato -uo meno prima o altrimenti impostato un riferimento a monte. In altre parole, voglio git pushautomaticamente avere l'effetto di git push -usu qualsiasi push di un ramo che non ha già un upstream.

È possibile? Se richiede un alias o uno script di utilità, va bene.


2
Hai verificato se è possibile utilizzare le opzioni push.defaulte branch.<name>.mergein git-config (1) ?

5
Ho push.defaultimpostato current- è così che posso semplicemente dire git push originsenza refspec o upstream. Ma non aiuta con l'impostazione automatica dell'upstream.
John

Risposte:


61

Puoi configurarlo con git configusing git config --global push.default current.

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


8
Ho quel set - è così che posso semplicemente dire git push originsenza refspec o upstream. Ma non aiuta con l'impostazione automatica dell'upstream.
John

Funziona per me: +1:
Tim Strijdhorst

Sì, come dice @ John, è importante tenere a mente che questo non rende la sezione locale pista quello remoto; crea solo il ramo remoto con lo stesso nome di quello locale.
waldyrious

Abbastanza buono se ne hai solo bisogno push, ad esempio solo uno sviluppatore è nel suo ramo, che modifica solo una copia di un repo.
superarts.org

26

Dal momento che non penso che ciò sia possibile usando git config, ecco cosa puoi fare in bash:

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

Se il ramo corrente ha un ramo di monitoraggio remoto, chiama git pushaltrimenti chiama git push -u


24
Adesso puoi farlo git config --global push.default current.
Andrea Bergonzo

2
@AndreaBergonzo questa è l'unica buona risposta per me, puoi aggiungerla come risposta?
pdem

6
@AndreaBergonzo, @pdem - nota che push.default=currentcrea solo un ramo nel repository remoto con lo stesso nome del ramo locale, ma non imposta il ramo locale per monitorare quello remoto. Non sono sicuro del motivo per cui è così, ma vale la pena tenerlo a mente.
waldyrious

22

Nota: il fatto che la nuova politica push predefinita " simple" si basi su un ramo con uno a monte significa che: l'
impostazione di un ramo a monte è visto come un passaggio volontario, non automatizzato nascosto

Quando " git push [$there]" non dice cosa spingere, abbiamo usato la semantica tradizionale di "corrispondenza" fino ad ora (tutti i tuoi rami sono stati inviati al telecomando fintanto che ci sono già rami con lo stesso nome laggiù).

Useremo la " simple" semantica che spinge il ramo corrente al ramo con lo stesso nome, solo quando il ramo corrente è impostato per integrarsi con quel ramo remoto .
C'è una variabile di configurazione delle preferenze dell'utente " push.default" per cambiarlo.


Così costruire da mechanicalfish 's risposta , è possibile definire un alias, con le virgolette doppie destra ( ") escape ( \"):

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

git pu origin

Sc0ttyD propone nei commenti il seguente 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 più righe:

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

1
Grazie per aver mostrato come impostare l'alias. Tuttavia, non sono chiaro sulla connessione o rilevanza della prima parte della tua risposta.
John

2
@ John il mio punto è: aggireresti un passaggio che dovrebbe essere intenzionale. Puoi impostare quell'alias, ma volevo chiarire agli altri lettori perché -uesiste questa opzione esplicita e perché non esiste una configurazione per rendere automatica detta opzione (da qui l'alias).
VonC

2
Ho un elenco di alias zsh nel mio .zshrc. Ho modificato questa risposta per creare il seguente alias zsh: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 Interessante, grazie. Ho incluso il tuo commento nella risposta per una maggiore visibilità.
VonC

17

Ho avuto lo stesso problema. Ho trovato questo alias (.gitconfig)

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

Utilizzo: git trackuna volta per nuovo ramo (attualmente estratto). Quindi spingere normalmente :)


15

Le risposte di @VonC e @Frexuz sono utili, ma entrambe le soluzioni producono un errore per me. Usando entrambe le loro risposte, ho messo insieme qualcosa che funziona per me:

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

Ciò si traduce nell'esecuzione di git push -u origin $BRANCHNAMEo git push, a seconda che branch.$BRANCHNAME.mergesia definita la sua proprietà a monte .

L'immissione di questo alias sulla riga di comando richiederà codici di escape, quindi probabilmente è più semplice utilizzare un editor da inserire nel file corretto ( $HOME/.gitconfig(globale), .git/config(locale) o /etc/gitconfig(sistema))


3
Questa è la risposta più semplice e completa. Per aprire l'editor predefinito senza cercare il file, puoigit config --global -e
Adam Tolley,

5

Risposta breve

Se in realtà ti piace essere esplicito e utilizzare l' -uopzione quando necessario, ma semplicemente non vuoi digitare il tutto:

git push -u origin foo

Quindi puoi usare il seguente alias:

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

E digita semplicemente:

git push-u

Risposta lunga

In genere, la necessità di -u(abbreviazione di --set-upstream) è quando abbiamo appena creato un nuovo ramo locale e un nuovo commit e vogliamo spingerlo a monte. Il repository remoto non ha ancora il nuovo ramo, quindi dobbiamo dire a git di creare e tracciare il ramo remoto prima di eseguire il commit. Questo è necessario solo per la prima spinta sul ramo. Ecco uno scenario tipico:

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

Personalmente, mi piace la necessità di essere esplicito con git push -u quando creo il ramo remoto: è un'operazione piuttosto significativa, condividere un ramo completamente nuovo con il mondo.

Tuttavia, odio che dobbiamo scrivere esplicitamente git push -u origin foo. Non solo è una seccatura digitare, ma soprattutto, è abbastanza soggetto a errori! È facile commettere un errore quando si digita il nome del ramo e il nuovo ramo remoto non avrà lo stesso nome del ramo locale! Nella maggior parte dei casi, in realtà, si desidera che il repository a monte sia origine il ramo a monte abbia lo stesso nome del ramo locale.

Pertanto, sto usando il seguente alias nel mio .gitconfig, che è un sottoinsieme dell'eccellente risposta fornita da Mark :

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

Ora possiamo fare quanto segue, che è ancora esplicito, ma meno soggetto a errori:

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

4

Ho risolto questo problema utilizzando questo semplice script Bash. Non funzionerà su rami esistenti, ma se crei tutti i tuoi rami con questa funzione, avrai sempre il tuo ramo a monte impostato automaticamente.

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

$ 1 rappresenta il primo argomento che passi dopo, conquindi è proprio come fare:

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

... semplicemente facendo questo:

con my-new-branch

2

Semplicemente:

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

2
Titolo della domanda: "Come configurare git push per impostare automaticamente l'upstream senza -u?" Descrizione: "Lo so git push -u, ma ...". Quindi questo non risponde alla domanda.
John

2
@ John ho aggiornato la mia risposta per suggerire un semplice alias.
djanowski

2
@ John Risponde alla domanda ora?
djanowski

1
@ ILI4SK4RIM Grazie, è assurdo che la mia risposta sia la più semplice, eppure è -1 ¯_ (ツ) _ / ¯
djanowski


1

Se vuoi usare le funzionalità di git integrate solo con il minor numero di chiavi possibile, digita semplicemente:

$ git push -u o tab H tab

e il completamento automatico ti darà $ git push -u origin HEAD

Per abilitare il completamento automatico su OSX, imposta un ~/.git-completition.bashfile con questo contenuto e aggiungi le seguenti righe al tuo ~/.bash_profilefile e riavvia il tuo terminale:

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

Colpisce anche i terminali integrati, come quello in vscode ecc.


completamento automatico? git non ha il completamento automatico. La tua shell (bash? Zsh?) Ha una serie di regole di completamento automatico caricate. Potete fornire informazioni sul set di regole di completamento automatico che state utilizzando e dove ottenerle?
vy32

Oh, in effetti grazie. Ho completato la mia risposta con le mie impostazioni di completamento automatico.
gazdagergo

Senza conoscere il contenuto del tuo file ~ / .git-completamento.bash, la tua risposta non è operativa.
vy32

1
Buon punto. Ho trovato la fonte del mio git-completition.bashe aggiunto alla mia risposta.
gazdagergo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.