如何配置 git 推自动设置上游没有-u?

我想 git push origin自动设置上游引用时,我推一个本地创建的分支的第一次。

我知道 git push -u,但是我不想考虑是否我以前使用过 -u或者设置过上游引用。换句话说,我希望 git push能够自动地对任何没有上游的分支的推进产生 git push -u的效果。

这可能吗? 如果它需要一个别名或实用程序脚本,这是罚款。

42771 次浏览

因为我认为使用 git config 是不可能的,所以在 bash 中可以这样做:

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

如果当前分支具有远程跟踪分支,则调用 git push,否则调用 git push -u

2022年: Git 2.37提议:

git config --global push.autoSetupRemote true

push.autoSetupRemote

如果设置为“ true”,假设在默认情况下按 --set-upstream,当没有 当前支路存在上游跟踪;

此选项通过 push.default选项‘ simple’、‘ upstream’和‘ current’生效。

如果默认情况下,您希望将新分支推到默认远程(如‘ push.default=current’的行为) ,并且还希望设置上游跟踪,那么这种方法非常有用。
最有可能受益于此选项的工作流是“ simple”中央工作流,其中所有分支都应该在远程上具有相同的名称。


2013年: 注: 新的默认推送策略“ simple依赖于一个上游分支,这意味着:
设置上游分支被视为一个自愿步骤,而不是一个隐藏的自动步骤

当“ git push [$there]”没有说明要推送什么时,到目前为止我们使用了传统的“匹配”语义(只要那里已经有相同名称的分支,所有分支都被发送到远程)。

我们将使用“ simple”语义,将当前分支推送到同名的分支 仅当当前分支被设置为与该远程分支集成时
有一个用户首选项配置变量“ push.default”来改变这一点。


因此,从 机械鱼回答开始,您可以定义一个别名,使用右双引号(")转义(\") :

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


git pu origin

Sc0ttyD 提出 在评论中的别名如下:

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'

我也遇到过同样的问题。我使用了这个别名(来自我的 .gitconfig)

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

用法:

  1. 每个新分支一次(当前签出) : git track
  2. 像往常一样用力:)

@ 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 $BRANCHNAMEgit push,具体取决于是否定义了它的上游(属性 branch.$BRANCHNAME.merge)。

在命令行中输入这个别名需要转义码,因此使用编辑器插入正确的文件($HOME/.gitconfig(global)、 .git/config(local)或 /etc/gitconfig(system))可能是最简单的

简单来说:

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

我使用这个简单的 Bash 脚本解决了这个问题。它不能在现有的分支上工作,但是如果你用这个函数创建所有的分支,你总是可以自动设置上游分支。

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

$1表示 con之后传递的第一个参数,所以它就像做:

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

只要这样做:

con my-new-branch

我用有用的脚本做了一个 git 扩展,包括这个:

usage: git line push


Push the current branch and set an upstream if needed.

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

您可以使用 git config --global push.default current(医生)配置它,使其推动当前分支以更新具有相同名称的分支。

2022年更新(git > = 2.37.0)

git config --global --add --bool push.autoSetupRemote true达到同样的效果,同时建立上行跟踪(医生)。

长话短说

如果您确实希望显式化,并在必要时使用 -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中使用了以下别名,它是优秀的 马克提供的答案的一个子集:

[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 功能,只有少数可能的按键,只需键入:

$ 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 等。

如果由于某种原因,其他的应答都不适合您,那么您可以使用 bash 函数替换 git push,以便在必要时使用正确的标志自动重新发送推送请求。

gitpush()
{
git push -v 2>&1 | # perform push command, pipe all output
tee /dev/tty | # keep output on screen and pipe it forward
(
cmd=$(sed -n "s/^.*\(git push --set-upstream origin .*\)$/\1/p");
[[ -n "${cmd// }" ]] && (echo "> $cmd"; eval $cmd);
) # if we get output that matches the command to perform, execute it
}

您将牺牲推送输出的进度部分,但除此之外,一切都按预期运行。

就个人而言,我将使用 JT 乔布的回答

对此唯一完全诚实的回答是“你不能”。

我已经读过了所有的回答,还有其他一些问题,都问了同样的问题。

张贴在 还是上的每个答案都要求您在第一次推送到新分支时传递特殊参数。

今天我看到了(一个新的?)选项“ push.autoSetupRemote”。 Git config help 说:

If set to "true" assume --set-upstream on default push when no upstream tracking exists for the current branch; this option takes effect with push.default options simple,
upstream, and current. It is useful if by default you want new branches to be pushed to the default remote (like the behavior of push.default=current) and you also want
the upstream tracking to be set. Workflows most likely to benefit from this option are simple central workflows where all branches are expected to have the same name on
the remote.