Comment configurer git push pour configurer automatiquement en amont sans -u?

100

Je voudrais git push origin définir automatiquement la référence en amont lorsque je pousse une branche créée localement pour la première fois.

Je sais git push -u, mais je ne veux pas avoir à me demander si j'ai déjà utilisé -uou défini une référence en amont. En d'autres termes, je veuxgit push avoir automatiquement l'effet de git push -usur toute poussée d'une branche qui n'a pas déjà d'amont.

Est-ce possible? Si cela nécessite un alias ou un script utilitaire, c'est très bien.

John
la source
2
Avez-vous vérifié s'il est possible d'utiliser les options push.defaultet branch.<name>.mergedans git-config (1) ?
5
Je me suis push.defaultmis à current- c'est ainsi que je peux simplement dire git push originsans refspec ou en amont. Mais cela n'aide pas à configurer automatiquement l'amont.
John

Réponses:

61

Vous pouvez le configurer à l' git configaide de git config --global push.default current.

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

Andrea Bergonzo
la source
8
J'ai cet ensemble - c'est ainsi que je peux simplement dire git push originsans refspec ou en amont. Mais cela n'aide pas à configurer automatiquement l'amont.
John
Fonctionne pour moi: +1:
Tim Strijdhorst
Ouais, comme le dit @John, il est important de garder à l'esprit que cela ne permet pas à la branche locale de suivre la branche distante; il crée simplement la branche distante avec le même nom que la branche locale.
waldyrious
Assez bien si vous en avez juste besoin push, par exemple, un seul développeur est sur sa branche, qui ne modifie qu'une seule copie d'un dépôt.
superarts.org
26

Puisque je ne pense pas que cela soit possible en utilisant git config, voici ce que vous pouvez faire dans bash:

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

Si la branche actuelle a une branche de suivi à distance, elle appelle git pushsinon elle appelle git push -u

poisson mécanique
la source
24
Vous pouvez maintenant le faire git config --global push.default current.
Andrea Bergonzo
2
@AndreaBergonzo c'est la seule bonne réponse pour moi, pouvez-vous l'ajouter comme réponse?
pdem du
6
@AndreaBergonzo, @pdem - notez que push.default=currentcrée uniquement une branche dans le référentiel distant avec le même nom que la branche locale, mais ne définit pas la branche locale pour suivre la branche distante. Je ne sais pas pourquoi c'est le cas, mais cela vaut la peine de garder à l'esprit.
waldyrious
22

Remarque: le fait que la nouvelle politique push par défaut " simple" repose sur une branche ayant une branche en amont signifie que: la
création d'une branche en amont est considérée comme une étape volontaire, pas une étape automatisée cachée

Quand " git push [$there]" ne dit pas quoi pousser, nous avons utilisé jusqu'à présent la sémantique traditionnelle "matching" (toutes vos branches ont été envoyées à la télécommande tant qu'il y a déjà des branches du même nom là-bas).

Nous utiliserons la simplesémantique " " qui pousse la branche courante vers la branche du même nom, uniquement lorsque la branche actuelle est configurée pour s'intégrer à cette branche distante .
Il existe une variable de configuration des préférences utilisateur " push.default" pour changer cela.


Donc , construire de mechanicalfish de réponse , vous pouvez définir un alias, avec les bons guillemets doubles ( ") échappé ( \"):

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

git pu origin

Sc0ttyD propose dans les commentaires l'alias suivant:

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

En plusieurs lignes:

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && 
           git push -u origin $(git symbolic-ref --short HEAD) || 
           git push'
VonC
la source
1
Merci d'avoir montré comment configurer l'alias. Je ne suis pas clair sur le lien ou la pertinence de la première partie de votre réponse.
John du
2
@John mon point est: vous contourneriez une étape qui est censée être intentionnelle. Vous pouvez configurer cet alias, mais je voulais expliquer clairement aux autres lecteurs pourquoi cette -uoption explicite existe, et pourquoi il n'y a pas de configuration pour rendre cette option automatique (d'où l'alias).
VonC le
2
J'ai une liste d'alias zsh dans mon .zshrc. J'ai modifié cette réponse pour créer l'alias zsh suivant: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 Intéressant, merci. J'ai inclus votre commentaire dans la réponse pour plus de visibilité.
VonC
17

J'ai eu le même problème. J'ai trouvé cet alias (.gitconfig)

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

Utilisation: git trackune fois par nouvelle branche (actuellement extraite). Ensuite, poussez simplement comme d'habitude :)

Frexuz
la source
15

Les réponses de @VonC et @Frexuz sont utiles, mais leurs deux solutions génèrent une erreur pour moi. En utilisant leurs deux réponses, j'ai concocté quelque chose qui fonctionne pour moi:

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

Cela se traduit par l'exécution de git push -u origin $BRANCHNAMEou git push, selon que sa propriété amont (branch.$BRANCHNAME.merge ) est défini.

La saisie de cet alias sur la ligne de commande nécessitera des codes d'échappement, il est donc probablement plus simple d'utiliser un éditeur pour l'insérer dans le bon fichier ( $HOME/.gitconfig(global), .git/config(local) ou /etc/gitconfig(system))

marque
la source
3
C'est la réponse la plus simple et la plus complète. Pour ouvrir l'éditeur par défaut sans rechercher le fichier, vous pouvezgit config --global -e
Adam Tolley
5

Réponse courte

Si vous aimez être explicite et utiliser l' -uoption si nécessaire, mais que vous ne voulez simplement pas taper le tout:

git push -u origin foo

Ensuite, vous pouvez utiliser l'alias suivant:

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

Et tapez simplement:

git push-u

Longue réponse

En règle générale, le besoin de -u(raccourci pour --set-upstream) est lorsque nous venons de créer une nouvelle branche locale et de commettre, et que nous voulons la pousser en amont. Le dépôt distant n'a pas encore la nouvelle branche, nous devons donc dire à git de créer et de suivre la branche distante avant de pousser le commit. Ceci n'est nécessaire que pour la première poussée sur la branche. Voici un scénario typique:

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

Personnellement, j'aime la nécessité d'être explicite git push -ulors de la création de la branche distante: c'est une opération assez importante, partager une toute nouvelle branche avec le monde.

Cependant, je déteste que nous devions écrire explicitement git push -u origin foo. Non seulement c'est pénible à taper, mais surtout, c'est assez sujet aux erreurs! Il est facile de se tromper en tapant le nom de la branche, et la nouvelle branche distante n'aura pas le même nom que votre branche locale! Dans la plupart des cas, vous voulez vraiment que le référentiel en amont soit originet que la branche en amont ait le même nom que votre branche locale.

Par conséquent, j'utilise l'alias suivant dans my .gitconfig, qui est un sous-ensemble de l'excellente réponse fournie par Mark :

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

Maintenant, nous pouvons faire ce qui suit, qui est toujours explicite, mais moins sujet aux erreurs:

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
la source
4

J'ai résolu ce problème en utilisant ce simple script Bash. Cela ne fonctionnera pas sur les branches existantes, mais si vous créez toutes vos branches avec cette fonction, votre branche amont sera toujours définie automatiquement.

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

Le $ 1 représente le premier argument que vous passez après condonc c'est comme faire:

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

... en faisant simplement ceci:

con my-new-branch
JT Jobe
la source
2

Simplement:

$ alias gush="git push -u origin HEAD"
Djanowski
la source
2
Titre de la question: "Comment configurer git push pour configurer automatiquement en amont sans -u?" Description: "Je sais git push -u, mais ...". Cela ne répond donc pas à la question.
John
2
@John J'ai mis à jour ma réponse pour suggérer un simple alias.
djanowski le
2
@John Répond-il à la question maintenant?
djanowski le
1
@ ILI4SK4RIM Merci, c'est fou que ma réponse soit la plus simple, mais c'est -1 ¯_ (ツ) _ / ¯
djanowski
1

Si vous souhaitez utiliser les fonctionnalités git intégrées uniquement avec le moins de clés possibles, tapez simplement:

$ git push -u o tab H tab

et la saisie semi-automatique vous donnera $ git push -u origin HEAD

Pour activer la saisie semi-automatique sur OSX, configurez un ~/.git-completition.bashfichier avec ce contenu et ajoutez les lignes suivantes à votre ~/.bash_profilefichier et redémarrez votre terminal:

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

Cela affecte également les terminaux intégrés, comme celui de vscode, etc.

Gazdagergo
la source
Saisie automatique? git n'a pas de saisie semi-automatique. Votre shell (bash? Zsh?) A un ensemble de règles de saisie semi-automatique chargées. Pouvez-vous fournir des informations sur l'ensemble de règles de saisie semi-automatique que vous utilisez et où les obtenir?
vy32 le
Oh, en acte merci. J'ai terminé ma réponse avec mes paramètres de saisie semi-automatique.
gazdagergo le
Sans connaître le contenu de votre fichier ~ / .git-completion.bash, votre réponse n'est pas opérationnelle.
vy32
1
Bon point. J'ai trouvé la source de mon git-completition.bashet ajouté à ma réponse.
gazdagergo le