“git push”的默认“refspec”集

时间:2016-04-16 16:28:00

标签: git

在此之前,我认为git fetchgit push$GIT_DIR/config的影响是相同的,因为两者都是repository engagements的命令,但是当我们将存储库添加为{ {1}}对于当前存储库,Git在remote repository中为refspec创建了一个默认的git fetch集,例如:

config

为什么不对配置文件中git push的默认refspec集做同样的事情?

我猜差异是由fetch = +refs/heads/*:refs/remotes/remote_repository/* 命令的目的引起的:

  • default的默认用途是fetch
  • downloading all objects and refs from another repository的默认用途是push

但我不确定我的猜测。这是真的吗?

2 个答案:

答案 0 :(得分:1)

简单地说,分支可以从一个远程跟踪分支拉出并推送到另一个分支。

即使您设置了默认推送政策(git config push.default),that would be overridden by a local branch.<name>.push config

Since git 2.5,您可以轻松区分用于获取和推送的refspec(如果没有针对分支的push refspec,则默认为fetch)

例如,如果您在主分支机构上,并希望查看您是否比您要推送的远程跟踪分支(默认情况下为origin/master)更先进或落后,但它可能是任何其他远程分支一个如果在配置中设置了branch.master.push

git for-each-ref --format="%(push:track)" refs/heads

快捷方式<branch>@{push}直接指向配置branch.master.push中设置的值。

例如,要查看尚未推送的提交:

git log @{push}..

请注意,在 Git 2.22(2019年第2季度)之前的%(push:track)选项中使用的--format令牌“git for-each-ref”和朋友没有显示右分支。
这已得到修复。

commit c646d09Damien Robert (DamienRobert)(2019年4月16日) (由Junio C Hamano -- gitster --合并于commit f560a4d,2019年5月8日)

  

ref-filter:对%(push:track)

使用正确的分支      

ref-filter.c中,处理原子%(push:track)时,   使用引用的stat_tracking_info计算前/后值   到上游分支。

     

通过在for_push中引入新标记stat_tracking_info来解决此问题   在remote.c中,它对推送分支执行相同的操作   更新stat_tracking_info的几个调用者来处理此标志。这个   确保我们将来每当使用此功能时都要小心   指定这应该适用于上游或推送分支。

答案 1 :(得分:0)

git push的工作方式略有不同。

您可以设置 push.default 参数来控制它。

这是git v2.0发行说明,它解释了git处理推送方式的变化(简单与匹配)。这已在git v2.0中更新,以修复默认的git push行为。

在git v2.0执行git push之前,它会推送所有已更改的分支(所有,而不仅仅是当前分支)。

  

Git v2.0发行说明

     

向后兼容性说明

     

git push [$there]没有说要推送什么时,我们已经使用了   到目前为止传统的 matching 语义(所有分支都已发送   只要已经存在同名分支,就可以到远程控制台   在那边)。在Git 2.0中,默认值现在是simple语义,   推动:

     
      
  • 只有当前分支到同名的分支,并且只有   当前分支设置为与该远程集成时   分支,如果你正在推送到同一个遥控器;或

  •   
  • 只有当前分支到具有相同名称的分支,如果您   正在推送到一个不是你常去的地方的遥控器。

  •   
     

您可以使用配置变量push.default进行更改   这个。如果你是一个想要继续使用的老人   matching语义,您可以将变量设置为matching   例。阅读文档以了解其他可能性。