我想git push origin在第一次推送本地创建的分支时自动设置上游参考。
我了解git push -u,但是我不想考虑我-u之前是否使用过或设置上游参考。换句话说,我希望git push在git push -u没有上游的分支的任何推送上自动产生效果。
这可能吗?如果需要别名或实用程序脚本,那很好。
Answers:
您可以git config使用进行配置git config --global push.default current。
文件:https://git-scm.com/docs/git-config/#Documentation/git-config.txt-pushdefault
git push origin无需参考说明或上游就可以说的方式。但这对自动设置上游没有帮助。
push,例如,他的分支中只有一位开发人员,他只编辑一份回购副本。
由于我认为使用git config不可能做到这一点,因此您可以在bash中执行以下操作:
[[ $(git config "branch.$(git rev-parse --abbrev-ref HEAD).merge") = '' ]] && git push -u || git push
如果当前分支具有远程跟踪分支,则调用,git push否则调用 git push -u
git config --global push.default current。
push.default=current仅在远程存储库中创建一个与本地分支同名的分支,而不将本地分支设置为跟踪远程分支。我不确定为什么会这样,但是值得牢记。
注意:新的默认推送策略“ simple”依赖于具有上游分支的分支这一事实意味着:
设置上游分支被视为自愿步骤,而不是隐藏的自动化步骤
当“
git push [$there]”没有说明要推送的内容时,到目前为止,我们已经使用了传统的“匹配”语义(只要您的所有分支都已发送到远程,只要那里已经有同名的分支)即可。仅当将当前分支设置为与该远程分支集成时,我们才会使用
simple将当前分支推送到具有相同名称的分支的语义。 用户偏好配置变量“ ”可以更改此设置。push.default
因此,根据mechanicalfish的答案构建,您可以定义一个别名,并使用正确的双引号(")转义(\"):
git config alias.pu "![[ $(git config \"branch.$(git rev-parse --abbrev-ref HEAD).merge\") = '' ]] && git push -u || git push"
git pu origin
alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'
在多行中:
alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] &&
git push -u origin $(git symbolic-ref --short HEAD) ||
git push'
-u存在此显式选项,以及为什么没有用于使该选项自动执行的配置(因此称为别名)。
alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'
@VonC和@Frexuz的回答很有帮助,但是它们的两个解决方案都对我产生了错误。使用他们的两个答案,我将对我有用的东西拼凑在一起:
[alias]
pu = ![[ $(git config "branch.$(git symbolic-ref --short HEAD).merge") = '' ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push
这导致执行git push -u origin $BRANCHNAME或git push,这取决于是否branch.$BRANCHNAME.merge定义了上游(属性)。
在命令行上输入此别名将需要转义码,因此使用编辑器将其插入正确的文件($HOME/.gitconfig(全局),.git/config(本地)或/etc/gitconfig(系统))最简单。
git config --global -e
简短答案
如果您实际上想露骨,并-u在必要时使用该选项,但只是不想输入整个内容:
git push -u origin foo
然后,您可以使用以下别名:
[alias]
push-u = !git push -u origin $(git symbolic-ref --short HEAD)
只需键入:
git push-u
长答案
通常,当我们刚刚创建了一个新的本地分支并提交,并且希望将其推向上游时,便需要-u(的简写--set-upstream)。远程存储库还没有新分支,因此我们需要在推送提交之前告诉git创建并跟踪远程分支。这仅对于分支上的第一次推送是必需的。这是一个典型的场景:
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
就我个人而言,我确实喜欢git push -u在创建远程分支时需要明确:它是一项非常重要的操作,将一个新的分支共享给世界。
但是,我讨厌我们必须明确编写git push -u origin foo。不仅打字很麻烦,而且更重要的是,它很容易出错!输入分支名称时容易出错,并且新的远程分支不会与本地分支具有相同的名称!实际上,在大多数情况下,您希望上游存储库为origin,并且上游分支与本地分支具有相同的名称。
因此,我在我的中使用了以下别名.gitconfig,这是Mark提供的出色答案的子集:
[alias]
push-u = !git push -u origin $(git symbolic-ref --short HEAD)
现在,我们可以执行以下操作,这些操作仍然很明确,但是不易出错:
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
我用有用的脚本做了一个git扩展,包括以下脚本:
usage: git line push
Push the current branch and set an upstream if needed.
如果您只想通过较少的键使用内置的git功能,只需键入:
$ git push -u o tab H tab
自动完成功能会给您
$ git push -u origin HEAD
要在OSX上启用自动补全功能,请设置一个包含此内容的~/.git-completition.bash文件,并将以下行添加到~/.bash_profile文件中,然后重新启动终端:
# git branch autocomplete
if [ -f ~/.git-completion.bash ]; then
. ~/.git-completion.bash
fi
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
它也会影响内置终端,例如vscode中的一个。
git-completition.bash并添加到我的答案中。
push.defaultandbranch.<name>.merge选项?