git-push与来自镜像存储库的refspec结合会删除其他分支吗?

时间:2019-07-17 08:45:19

标签: git git-push git-mirror

有两个远程存储库,如下所示。

  • original.git:原始的裸存储库。
  • mirror.git:使用git clone --mirror original.git克隆的镜像存储库。

使用git push --mirror将引用从镜像推送到原始远程服务器,可以正常工作。但是,当refspec(例如分支名称)与git-push结合使用时,Git会尝试从原始存储库和镜像存储库中删除除指定分支之外的所有其他分支。

  1. Git为什么尝试删除其他分支?
  2. 在未在远程存储库中设置receive.denyDeletes的情况下,如何防止删除远程分支? (我只是误删了远程分支。)

注意:我现在正在使用git v2.18.0,据我所知,git push --mirror <repo> <refsepc>在较旧的版本(例如git v1.7.1)中是不允许的。

bash-4.1$ cd mirror.git/
bash-4.1$ git branch
* master
  new_branch

bash-4.1$ git config --list | grep remote
remote.origin.url=/user/han/git/original.git/
remote.origin.fetch=+refs/*:refs/*
remote.origin.mirror=true

bash-4.1$ git push --mirror
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 16 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 280 bytes | 280.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /user/han/git/original.git/
 * [new branch]      new_branch -> new_branch

bash-4.1$ git push origin master
To /user/han/git/original.git/
 - [deleted]         new_branch

1 个答案:

答案 0 :(得分:0)

specification for the --mirror option in git push是:

  

不是指定每个引用来推送,而是指定以下所有引用    refs/(包括但不限于refs/heads/,    refs/remotes/refs/tags/)镜像到远程    资料库。新创建的本地裁判将被推送到远程    端,本地更新的参考将在远端强制更新,    和已删除的引用将从远端删除。这是    如果设置了配置选项remote.<remote>.mirror,则默认设置。

(黑体字)。将--mirror与命令行refspec结合使用会使您的Git相信命令行上提到的所有 not 引用都将被删除,这将导致您的Git发送“删除此ref”请求。 > 1 到另一个Git。

有人可能会认为这是一个错误-您自己的Git应该只是拒绝将--mirror与命令行参数refspecs结合使用的尝试-这肯定有点不友好。另请参见--prune,它具有相似的行为,并且旨在与命令行参考规范结合使用。


1 像往常一样,它们采取有礼貌的形式,“如果愿意,请执行”,除非您在命令行中添加了--force标志,或者生成请求的refspec的加号。不幸的是,默认情况下,要遵守 delete 分支的礼貌请求,而不同于礼貌地请求以非快进方式移动分支。