Git push --all vs --mirror

21

git push --allgit push --mirror有什么区别?

我只知道这个:

  • 在本地分支被删除的情况下,--all不会将其推送,而--mirror会将其推送。

这是正确的吗?

还有其他区别吗?

2个回答

25

正如文档中所述:

--all

    推送所有分支(即 refs/heads/ 下的引用),不能与其他 <refspec> 一起使用。

--mirror

    ... 指定将镜像化 refs/ 下(其中包括但不限于 refs/heads/refs/remotes/refs/tags/)的所有引用 ...

因此,a,如果不是唯一的区别,那么关键区别是其中一个表示 refs/heads/*,另一个表示 refs/*refs/heads/* 是分支名,任何在 refs/remotes/ 中的内容都是远程跟踪名称,而任何在 refs/tags/ 中的内容都是标签名称。其他值得注意的命名空间包括 refs/notes/refs/replace/ 和单数形式的 refs/stash

--mirror 选项接着提到:

本地更新的引用将被强制更新到远程端,并且已删除的引用将从远程端移除。

因此,--mirror 实际上意味着同时包含了 --force--prune;而 --all 则不是。但是,如果您愿意,您可以向 git push --all 添加 --force 和/或 --prune

始终由其他 Git 决定是否遵守礼貌请求(没有 --force 的请求)或命令(--force),以更改其引用。

删除本地分支后,--all 不会将其推送,而 --mirror 则会。

这是使用 --prune 选项的结果:告诉 Git 使用 --prune 意味着“要求它们删除其名称空间中不在我的名称空间中的名称”。


好的,谢谢你@torek。我发布这个问题是因为我在执行push --all时出现了错误。问题是我没有使用--force选项,而文档说通常,该命令会拒绝更新不是用于覆盖它的本地引用的祖先的远程引用。此标志禁用检查。这可能导致远程存储库丢失提交;请小心使用。这是我的情况,因为我已经重置并删除了一些提交。这正确吗? - Dani
1
是的。通常使用git reset将分支名称“向后”移动需要某种形式的强制推送。如果您的Git不太古老,则可以使用“force with lease”选项以及直接使用--force,这使您的Git告诉其他Git:我相信您的分支名称B标识了某个提交<hash>,如果是这样,请让B标识此其他提交。这个更安全,因为如果您搞错了,他们会用错误拒绝推送:我的B没有标识那个提交,所以我什么也没做。 - torek

2
使用 Git 2.24(2019年第四季度),您将无法在--mirror下使用git push --all

问题在于:当您使用--mirror克隆本地存储库时,有时会隐含使用--all进行推送
最近Filippo Valsorda遭遇了不幸的经历。他说:recently">“好吧,Git,我特么搞不懂。这不在手册中。”

https://pbs.twimg.com/media/ECcR4vaXsAQ4bfm?format=jpg&name=4096x4096

所以,修复了一个早期的回归问题,即当目标远程仓库设置为镜像时,应禁止使用“git push --all”。
请参见Thomas Gummerer (tgummerer)于2019年9月2日提交的提交 8e4c8af(由Junio C Hamano -- gitster --于2019年9月30日合并至提交 fe048e4

push:在设置了remote.<name>.mirror时,禁止使用--all和refspecs

当使用--mirror选项进行'git push'或在存储库的配置中设置'remote.<name>.mirror'时,不允许使用--all或refspecs选项,因为它们可能会产生令人惊讶的影响。2018-05-16,Git v2.18.0-rc0的800a4ab("push: check for errors earlier")重新设计了此代码以提前检查这些选项的存在而非其副作用。但是,当在配置中设置'remote.<name>.mirror'时,只有在调用'do_push()'后才能设置TRANSPORT_PUSH_MIRROR标志,因此检查会完全错过它。这给用户带来了意外的影响(请参见上文)。通过确保在检查各种选项的兼容性之前设置标志(如果适用),来解决这个问题。
这导致在Git 2.29(2020年第四季度)进行了代码清理。
查看 提交842385b, 提交9dad073, 提交26e28fe, 提交75d3bee, 提交20f4b04, 提交5b9427e, 提交8d2aa8d, 提交424e28f, 提交e885a84, 提交185e865 (2020年9月30日) 由 Jeff King (peff) 提交。
(由Junio C Hamano -- gitster -- 合并于 提交19dd352, 2020年10月5日)push: 删除未使用的repo参数以便于do_push()函数调用”
“已签署:Jeff King”
我们停止在8e4c8af058中使用"repo"参数("push: disallow --all and refspecs when remote..mirror is set", 2019-09-02, Git v2.24.0-rc0 -- merge listed in batch #4),这将pushremote处理移动到其调用者中。

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