Git push

时间:2016-05-10 18:56:32

标签: git git-push

Git-config中,您可以看到:

  

branch.name.remote

     

当在分支< name>上时,它告诉git fetch和git push哪个远程到   从/推送到。可以覆盖要推送的遥控器   remote.pushDefault(适用于所有分支)。远程推送,为   当前分支,可以被分支进一步覆盖。< name> .pushRemote。   如果没有配置远程,或者您不在任何分支上,那么   默认为原始提取和 remote.pushDefault 推送

现在我有一个cloned存储库和一个名为 test 已检查的分支。在这里,您可以看到克隆存储库的config文件的内容:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = ...
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

如您所见,branch. test .pushRemoteremote.pushDefaultbranch. test < / strong> .remote未设置在那里。所以我希望我什么时候

$ git push

我会得到

fatal: No configured push destination.

但是我得到了

Everything up-to-date

似乎Git使用origin而不是未配置remote.pushDefault。但是为什么当文档说

  

推送 默认为 remote.pushDefault

编辑:

Git-push中,您可以看到:

  

当命令行没有指定推送的位置时   &LT;库&GT;参数,分支。*。当前的远程配置   咨询分支以确定推送的位置。如果配置   缺少,默认为 origin

它认为使用originremote.pushDefault之间存在冲突。

3 个答案:

答案 0 :(得分:3)

如果你看一下remote.pushDefault的表达式:

  

remote.pushDefault
            默认情况下推送到的遥控器。覆盖分支。             .remote为所有分支,并被分支覆盖。             .pushRemote for specific branches。

所以这意味着在推送时覆盖默认遥控器。当它没有设置时,它什么都不做,并且默认的原点远程起作用。

请注意,稍后添加了remote.pushDefault(v1.8.3),因此当这些语义发生变化时,它会破坏很多东西。

答案 1 :(得分:3)

Git的推送代码(也是拉,真的)是(在我看来)不必要的复杂,因为它试图保留大量的历史行为,其中一些是坏主意。

让我们先来看the REMOTES section of the git-push documentation

  

可以使用以下某个名称而不是URL作为 repository 参数:

     
      
  • Git配置文件中的遥控器:$GIT_DIR/config

  •   
  • $GIT_DIR/remotes目录中的文件或

  •   
  • $GIT_DIR/branches目录中的文件。

  •   
     

所有这些也允许你从命令行中省略refspec,因为它们都包含一个gs默认使用的refspec。

(遥控器的名称 - 再次,这只是我的意见 - 这是其中唯一一个真正应该存在的。我认为指定的URL方法可能应该转移到管道命令,{{1可能会返回到一个简单的脚本,尽管由于Windows性能问题,Git-on-Windows人员试图从脚本转换。)

幸运的是,您使用的是named-remote方法,因此我们可以忽略其中的大部分内容。具体来说,refspec是可选的,因为您在git push中使用了一个遥控器。

接下来,我们应该清楚地区分语法(名词和动词以及您在命令行中输入的内容)和语义(行为)。一旦我们抛弃了额外的“远程”变种,我们就会完成两项任务:

  1. 选择遥控器。
  2. 选择refspec。
  3. 您使用的语法$GIT_DIR/config,即没有指定 git push 参数,也没有指定 repository < / em>的。因此,对于第1步,选择一个遥控器,Git使用您在编辑中引用的段落:找到当前分支 - 在这种情况下为refspec - 然后查找test。这没有配置(“缺失”),因此Git回退到使用branch.test.remote

    (引用的文档段落中有一个错误,因为它没有提及origin,在这种情况下将是branch.branch.pushRemote。正确的顺序是(1)寻找特定于分支的pushRemote ;(2)寻找特定于分支的远程;(3)如果Git版本1.8.3或更新版本,则查找branch.test.pushRemote;(4)尝试单词remote.pushDefault。此文档错误仍在git中2.8.1。)

    由于origin 有效的远程名称,步骤1会成功,我们继续执行步骤2,选择refspec。这部分不会让你感到困惑,只是为了完整性:

      

    当命令行未指定使用 origin 推送的内容时    参数或refspec ...--all--mirror选项,命令找到    默认 --tags ,咨询refspec配置,如果是的话    找不到,尊重remote.*.push配置来决定推送什么    (有关push.default)的含义,请参阅git-config(1)

    因此,在这种情况下,Git会查找push.default,因为未设置remote.origin.push。如果未设置push.default,则会出现“默认默认值”,在2.0之前的Git中为push.default,现在为(Git 2.0或更新版本)matching。此默认值simple表示总是一个refspec。

    默认远程名称push.default表示通常一个遥控器。仅当origin中没有[remote "origin"]部分时,此操作才会失败。

答案 2 :(得分:0)

答案并不像获取那样简单,因为需要考虑一系列故障预置:

要以编程方式获取远程,请参见this question