【发布时间】:2022-06-17 22:23:02
【问题描述】:
如何在 GitLab 服务器之间克隆存储库以保持分支名称和路径一致?
我使用以下顺序在 GitLab 服务器之间克隆存储库,中间是本地 git 客户端:
git clone <source URL>
for /F %R in ('git branch -r') do git branch --track %R %R
git fetch --all
git pull --all
git fetch --tags
git remote rm origin
git remote add origin <target URL>
git push --all
git push --tags
但是这个序列改变了分支路径并创建了源服务器上不存在的分支。
说我在源 GitLab 中有一个带有 2 个分支的仓库:
* branch1
branch2
(这里和下面的星标是默认分支)
当我使用 git clone 将 repo 克隆到本地计算机时,我得到了两个额外的分支,与源服务器上的默认分支相关:
* branch1
remotes/origin/HEAD -> origin/branch1
remotes/origin/branch1
remotes/origin/branch2
git branch --track之后分支数增加到7个:
* branch1
origin/HEAD
origin/branch1
origin/branch2
remotes/origin/HEAD -> remotes/origin/branch1
remotes/origin/branch1
remotes/origin/branch2
此外,新的 HEAD 分支(origin/HEAD)不再与任何 branch1 分支相关。
最后,当我删除旧的原点并添加一个新的时,我得到:
* branch1
origin/HEAD
origin/branch1
origin/branch2
这正是将推送到目标 GitLab 服务器的内容。一个分支有两个重复项('branch1'、'origin/branch1' 和 'origin/HEAD'),另一个更改了它的路径('branch2' -> 'origin/branch2')。
在这里,我可以删除“额外”分支并手动重命名所有分支,然后再将它们推送到目标服务器。但是当一个 repo 中有数百个分支时,这变得很头疼。
虽然我可以编写一个脚本在推送之前从所有这些分支的名称中删除“origin/”,但我感觉就像发明了一辆自行车。有没有更简单的方法可以让目标 GitLab 中的分支名称与源 GitLab 中的分支名称完全相同?
【问题讨论】:
-
Git 在这里并没有真正处理“路径”:分支名称 act like 路径名称(Git 有时将它们存储在文件系统实体中)但它们实际上并不是路径名称。但一般来说,如果您要复制带有
git clone的存储库 并且 您想要复制 names 数据库以及 commits-and-other-objects 数据库,您想要--mirror。您将从源执行一个镜像克隆,并将一个镜像推送到目标(然后删除中间镜像)。请注意,这不会复制 GitLab 问题、MR 等数据库。 -
谢谢 torek,当然,我知道这些不是真正的路径,我只是将它们作为更“人性化”的解释。我可能会称它们为命名空间,只是斜线更常与路径相关联。让我试试 --mirror 语法。除了这里的代码库,我什么都不关心。
标签: git git-branch