【问题标题】:How to configure git push to automatically set upstream without -u?如何配置 git push 以在没有 -u 的情况下自动设置上游?
【发布时间】:2013-07-24 16:59:54
【问题描述】:

我希望git push origin 在我第一次推送本地创建的分支时自动设置上游引用。

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

这可能吗?如果它需要别名或实用程序脚本,那很好。

【问题讨论】:

  • 您是否检查过是否可以在git-config(1) 中使用push.defaultbranch.<name>.merge 选项?
  • 我将push.default 设置为current - 这就是我可以说git push origin 而没有参考规范或上游。但它对自动设置上游没有帮助。

标签: git


【解决方案1】:

您可以使用git config 使用git config --global push.default current 对其进行配置。

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

【讨论】:

  • 我有那一套——这就是我可以说git push origin 没有参考规范或上游。但它对自动设置上游没有帮助。
  • 是的,正如@John 所说,重要的是要记住,这不会使本地分支跟踪远程分支;它只是创建与本地分支同名的远程分支。
  • 如果您只需要 push 就足够了,例如只有一个开发人员在他的分支上,他只编辑一个 repo 的副本。
【解决方案2】:

由于我认为使用 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
  • @AndreaBergonzo 这是对我来说唯一好的答案,您可以将其添加为答案吗?
  • @AndreaBergonzo, @pdem -- 请注意push.default=current 仅在远程存储库中创建与本地分支同名的分支,但设置本地分支来跟踪远程的。我不确定为什么会这样,但值得牢记。
  • 没错,有了这个别名,也可以看到分支在上游的前面/后面的提交。
【解决方案3】:

注意:new default push policy "simple" 依赖于具有上游分支的分支这一事实意味着:
设置上游分支被视为自愿步骤,而不是隐藏的自动化步骤

当“git push [$there]”没有说要推送什么时,我们一直使用传统的“匹配”语义(只要那里已经有同名的分支,你所有的分支都被发送到远程) .

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


因此,从mechanicalfishanswer 构建,您可以定义一个别名,右双引号(")转义(\"):

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

git pu origin

Sc0ttyD 建议in the comments 使用以下别名:

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'

【讨论】:

  • 感谢您展示如何设置别名。不过,我不清楚与您答案第一部分的联系或相关性。
  • @John 我的意思是:你会绕过一个应该是故意的步骤。您可以设置该别名,但我想向其他读者说明为什么存在此显式 -u 选项,以及为什么没有使所述选项自动的配置(因此别名)。
  • 我的 .zshrc 中有一个 zsh 别名列表。我修改了这个答案以创建以下 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 很有趣,谢谢。我已将您的评论包含在答案中以提高知名度。
【解决方案4】:

我也遇到了同样的问题。我找到了这个别名 (.gitconfig)

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

用法:git track 每个新分支一次(当前已签出)。然后像往常一样推送:)

【讨论】:

    【解决方案5】:

    @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(全局)、.git/config(本地)或/etc/gitconfig(系统))

    【讨论】:

    • 这是最直接最完整的答案。要打开默认编辑器而不寻找文件,您可以git config --global -e
    【解决方案6】:

    我通过使用这个简单的 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
    

    【讨论】:

      【解决方案7】:

      简答

      如果您确实喜欢明确并在必要时使用-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 中使用了以下别名,它是优秀answer provided by 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
      

      【讨论】:

        【解决方案8】:

        如果您只想通过不太可能的按键来使用内置的 git 功能,只需键入:

        $ git push -u o 标签 H 标签

        自动完成功能将为您提供 $ git push -u origin HEAD

        要在 OSX 上启用自动编译,请设置 ~/.git-completition.bash 文件 with this content 并将以下行添加到您的 ~/.bash_profile 文件并重新启动终端:

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

        它也会影响内置终端,例如 vscode 中的终端等。

        【讨论】:

        • 自动完成? git 没有自动完成功能。你的 shell(bash?zsh?)加载了一组自动完成规则。您能否提供有关您正在使用哪组自动完成规则以及从何处获取这些规则的信息?
        • 哦,真的谢谢。我已经用我的自动完成设置完成了我的回答。
        • 在不知道你的文件 ~/.git-completion.bash 的内容的情况下,你的答案是不可操作的。
        • 好点。我找到了我的git-completition.bash 的来源并添加到我的答案中。
        【解决方案9】:

        简单地说:

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

        【讨论】:

        • 问题标题:“如何配置 git push 以自动设置上游而不用 -u?”描述:“我知道git push -u,但是……”。所以这并不能回答问题。
        • @John 我更新了我的答案以建议一个简单的别名。
        • @John 现在回答问题了吗?
        • @ILI4SK4RIM 谢谢,我的答案是最简单的,这太疯狂了,但它是-1¯_(ツ)_/¯
        【解决方案10】:

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

        我已阅读本文中的所有回复,以及提出相同问题的其他问题。

        发布的每个答案仍然要求您在第一次推送到新分支时传递特殊参数。

        【讨论】:

        【解决方案11】:

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

        usage: git line push
        
        Push the current branch and set an upstream if needed.
        

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

        【讨论】:

          【解决方案12】:

          如果无论出于何种原因,其他答案都不适合您,那么您可以使用此 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 Jobe's answer

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-13
            • 2019-05-23
            • 1970-01-01
            • 1970-01-01
            • 2020-03-22
            • 1970-01-01
            • 1970-01-01
            • 2019-08-05
            相关资源
            最近更新 更多