Git推送--全部vs--镜像

Git推送--全部vs--镜像,git,github,push,Git,Github,Push,git-push--all和git-push--mirror之间有什么区别 我只知道: 对于已删除的本地分支,--all不会推送它,而--mirror会推送它 这是正确的吗 还有其他区别吗?如中所述: --全部 推动所有分支(即refs/heads/下的refs);不能使用 与其他人一起。 --镜子 。。。指定镜像refs/(包括但不限于refs/heads/、refs/remotes/和refs/tags/)下的所有ref… 因此,如果不是关键区别的话,关键区别在于一个是指refs/hea

git-push--all
git-push--mirror
之间有什么区别

我只知道:

  • 对于已删除的本地分支,
    --all
    不会推送它,而
    --mirror
    会推送它
这是正确的吗

还有其他区别吗?

如中所述:

--全部

    推动所有分支(即
    refs/heads/
    下的refs);不能使用 与其他人一起。
--镜子

    。。。指定镜像
    refs/
    (包括但不限于
    refs/heads/
    refs/remotes/
    refs/tags/
    )下的所有ref…
因此,如果不是关键区别的话,关键区别在于一个是指
refs/heads/*
,另一个是指
refs/*
refs/heads/*
名称是分支名称。
refs/remotes/
中的任何内容都是远程跟踪名称,
refs/tags/
中的任何内容都是标记名称。其他值得注意的名称空间包括
refs/notes/
refs/replace/
,以及单数
refs/stash

--mirror
选项接着提到:

本地更新的引用将在远程端强制更新, 删除的参照将从远程端删除

因此,
--mirror
有效地暗示了
--force
--prune
<代码>--所有不可用。但是,如果愿意,您可以将
--force
和/或
--prune
添加到
git push--all

总是由另一个Git来决定是否遵守礼貌的请求(那些在没有
--force
的情况下发送的请求)或命令(
--force
)来更改其引用

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

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

使用Git 2.24(2019年第4季度),你将无法使用
Git push--all
--mirror

问题是:
--all
有时是隐含的,当您从本地存储库中推送刚刚用
--mirror

克隆的存储库时 最近有一次不幸的经历:

好的,吉特,WTF。这不在手册页中

因此,修复早期对“
git push--all
”的回归,当目标远程存储库设置为镜像时,应该禁止该回归

参见作者(2019年9月2日)
(于2019年9月30日合并)

push
:设置了
remote..mirror
时,不允许
--所有
和refspecs
如果将
--all
推送,或者将
--mirror
指定给“git push”,或者在存储库的配置中设置了“
remote..mirror
”,则不允许使用refspec推送,因为它们可能会产生意外的效果。
(“
push
:更早地检查错误”,2018-05-16,Git v2.18.0-rc0)重构此代码以更早地进行检查,因此我们可以明确检查标志的存在,而不是其副作用

但是,当在配置中设置“
remote..mirror
”时,
TRANSPORT\u PUSH\u mirror
标志将仅在调用“
do\u PUSH()
”后设置,因此检查将完全忽略它

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

通过确保在检查各种选项的兼容性之前设置标志(如果合适)来修复此问题

这导致了Git2.29(2020年第4季度)的代码清理

参见,,,,(2020年9月30日)作者 (于2020年10月5日合并)

:将未使用的回购参数拖放到
do\u push()
签字人:杰夫·金

在2019-09-02,Git v2.24.0-rc0中列出的(“
pushremote
:disallow--all和refspecs when remote..mirror已设置”),我们停止使用“repo”参数,这将
pushremote
处理移到其调用者


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