Git push --all vs --mirror

时间:2018-03-17 23:38:07

标签: git github push

git push --allgit push --mirror之间的区别是什么?

我只知道这个:

  • 对于已删除的本地分支,--all不会推送它,而--mirror会推送它。

这是对的吗?

还有其他差异吗?

2 个答案:

答案 0 :(得分:8)

正如the documentation中所述:

  

- 所有

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

- 镜

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

所以 a ,如果不是 ,关键区别在于一个意味着refs/heads/*,一个意味着refs/*refs/heads/*名称是分支名称。 refs/remotes/中的任何内容都是远程跟踪名称,refs/tags/中的任何内容都是标记名称。其他值得注意的名称空间包括refs/notes/refs/replace/和单数refs/stash

--mirror选项继续提及:

  

本地更新的refs将在远程端强制更新,    已删除的引用将从远程端删除。

因此--mirror有效地暗示了--force--prune; --all没有。但是,如果您愿意,可以将--force和/或--prune添加到git push --all

始终由其他 Git决定是否遵守礼貌请求(不带--force的请求)或命令(--force)来更改其引用

  

对于已删除的本地分支,--all不会推送它,而--mirror会推送它。

这是--prune选项的结果:告诉你的Git使用--prune意味着“要求他们删除名字空间中不属于我的名字”。

答案 1 :(得分:1)

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

问题是:{em}有时会暗示--all,当您从刚用--mirror克隆的本地存储库中推送时。< br /> Filippo Valsorda最近发生了不幸的经历:

  

确定,git,WTF。这不在手册页中。

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

因此,将目标远程存储库设置为镜像时,应将先前的回归修复为“ git push --all”。

请参见commit 8e4c8afThomas Gummerer (tgummerer)(2019年9月2日)。
(由Junio C Hamano -- gitster --commit fe048e4中合并,2019年9月30日)

  

push:设置--all时禁止remote.<name>.mirror和refspecs

     

在将--all赋予'git push'或在存储库的配置中设置'--mirror'时,不允许使用remote.<name>.mirror或refspec进行推送,因为它们可以具有惊人的效果。
  800a4ab(“ push:更早检查错误”,2018-05-16,Git v2.18.0-rc0)重构了此代码以更早进行检查,因此我们可以显式检查是否存在以下内容:标志,而不是其副作用。

     

但是,如果在配置中设置了“ remote.<name>.mirror”,则仅在调用“ TRANSPORT_PUSH_MIRROR”之后才设置do_push()标志,因此检查将完全丢失它。

     

这会给用户带来惊喜(见上文)。

     

通过在检查各种选项的兼容性之前确保已设置标记(如果适用)来解决此问题。