git push --all
和git push --mirror
有什么区别?
我只知道这个:
- 在本地分支被删除的情况下,
--all
不会将其推送,而--mirror
会将其推送。
这是正确的吗?
还有其他区别吗?
正如文档中所述:
--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
意味着“要求它们删除其名称空间中不在我的名称空间中的名称”。
--mirror
下使用git push --all
。--mirror
克隆本地存储库时,有时会隐含使用--all
进行推送。git push --all
”。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
标志,因此检查会完全错过它。这给用户带来了意外的影响(请参见上文)。通过确保在检查各种选项的兼容性之前设置标志(如果适用),来解决这个问题。peff
) 提交。gitster
-- 合并于 提交19dd352, 2020年10月5日)
“push
: 删除未使用的repo参数以便于do_push()
函数调用”push
: disallow --all and refspecs when remote..mirror is set", 2019-09-02, Git v2.24.0-rc0 -- merge listed in batch #4),这将pushremote
处理移动到其调用者中。
push --all
时出现了错误。问题是我没有使用--force
选项,而文档说通常,该命令会拒绝更新不是用于覆盖它的本地引用的祖先的远程引用。此标志禁用检查。这可能导致远程存储库丢失提交;请小心使用。
这是我的情况,因为我已经重置并删除了一些提交。这正确吗? - Danigit reset
将分支名称“向后”移动需要某种形式的强制推送。如果您的Git不太古老,则可以使用“force with lease”选项以及直接使用--force
,这使您的Git告诉其他Git:我相信您的分支名称B标识了某个提交<hash>
,如果是这样,请让B标识此其他提交。这个更安全,因为如果您搞错了,他们会用错误拒绝推送:我的B没有标识那个提交,所以我什么也没做。 - torek