"git push" 的默认 "refspec" 集合是什么?

3
在此之前,我认为git fetchgit push$GIT_DIR/config的影响是相同的,因为两者都是用于存储库交互的命令,但当我们将一个存储库添加为当前存储库的远程存储库时,Git会在config中为git fetch创建一组默认的refspec,例如像这样:
fetch = +refs/heads/*:refs/remotes/remote_repository/*

为什么在配置文件中,git push的默认refspec设置不同于fetch的呢?
我猜测这是由命令的默认目的所引起的:
- fetch的默认目的是从另一个存储库下载所有对象和引用。 - push的默认目的是更新特定的远程引用以及相关联的对象。
但我不确定我的猜测是否正确。这是真的吗?
2个回答

2

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

即使您设置了默认的推送策略(git config push.default),它也会被本地的branch.<name>.push配置所覆盖

自 git 2.5 版本以来, 您可以轻松区分用于获取和推送的 refspec(如果没有分支的推送 refspec,则默认为获取 refspec)

例如,如果您在主分支上,并且想要查看与您正在推送到的远程跟踪分支(默认情况下为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年第二季度)之前,--format选项中使用的%(push:track)标记在"git for-each-ref"和相关工具中未显示正确的分支。
这个问题已经得到解决。
请参见提交 c646d09(由Damien Robert (DamienRobert)于2019年4月16日提交)。
(由Junio C Hamano -- gitster --提交 f560a4d中合并,2019年5月8日)

ref-filter: 使用正确的分支来处理 %(push:track)

ref-filter.c 中,当处理 %(push:track) 这个选项时,ahead/behind 值是使用 stat_tracking_info 计算的,而该函数引用了上游分支。

为解决这个问题,在 remote.c 中的 stat_tracking_info 函数中引入一个新标识 for_push,它与上游分支相同但适用于推送分支。
更新少量调用 stat_tracking_info 的函数以处理该标识。这样可以确保在将来使用该函数时,我们会小心指定应用于上游分支还是推送分支。


警告:在处理 "for-each-ref" 和相关元素的 "%(push)" 格式化元素时,当相同的代码路径开始处理 "%(push:<what>)" 时出现了错误,该错误已在 Git 2.32 (Q2 2021) 中得到纠正。

请参见 提交记录 1e1c4c5(由 ZheNing Hu (adlternative) 于 2021 年 5 月 11 日提交)
(由 Junio C Hamano -- gitster --提交记录 36a255a 中合并,于 2021 年 5 月 20 日)

ref-filter: 修复读取无效联合成员的 bug

署名:ZheNing Hu
[jc:进一步测试修复]
署名:Junio C Hamano

used_atom.u 是一个联合体,根据要记录的辅助数据所属的原子类型不同,它具有不同的成员。
最多只能有一个成员在任何时候是有效的。
由于代码在检查 u.remote_ref 时甚至没有确保原子类型是 "push" 或 "push:"(这只是 u.remote_ref.push 变为有效的两种情况之一),但 u.remote_ref 与联合体的其他成员共享相同的存储空间,因此该检查读取了无效成员的值,这就是 bug。

在此处修改条件以检查原子名称是否等于 "push" 或以 "push:" 开头,以避免读取联合体的无效成员的值。


0

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

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


这是git v2.0发布说明,解释了git对push(简单与匹配)处理方式的变更。这在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。阅读其他可能性的文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接