一个维护了将近三年的php项目,最近需要交给工程组的同事维护,需要把我们成都内网的gitlab仓库的一些项目同步一份到武汉gitlab仓库。可能后续,还会再次同步更新。(成都仓库可能发生新的commit,需要把最新的变动同步到武汉仓库)

所以,这里就需要用到git clone --mirror old.git的相关命令,来完成代码仓库的镜像同步操作。

最终的效果是,迁移后的仓库内容是包含了现有分支的所有commit、merge等分支上的变动历史记录!这些记录就是这些代码的前世今生!

下面正文部分就是记录本次迁移所使用到的相关命令,以及一些git命令报错的原因定位+解决方法。

把大象放进冰箱的步骤:

1.在新gitlab服务器上确保你有相关权限可以创建一个项目

新建完毕,长这个样子:

目前这个仓库是个空的!没关系,我们要的效果就是空的!因为我们把另外一个gitlab服务器上的特定项目用来同步到这个空项目!如果不是空的反而会踩一些坑,后面举例说明!

2.在你电脑上找一个目录,在此目录打开git bash的命令行交互窗口

注意:xxx.git的东西是已经同步了仓库信息的历史镜像文件,你的在此应该就是s9-migrate的空目录!

在git bash的命令行窗口依次输入:

wzp@DESKTOP-8HFQM2M MINGW64 /e/临时导出/s9-migrate
$ git clone --mirror http://10.251.9.191/open-v/section9-config.git
Cloning into bare repository 'section9-config.git'...
remote: Enumerating objects: 1221, done.
remote: Counting objects: 100% (1221/1221), done.
remote: Compressing objects: 100% (529/529), done.
remote: Total 1221 (delta 694), reused 1166 (delta 653)
Receiving objects: 100% (1221/1221), 866.71 KiB | 10.44 MiB/s, done.
Resolving deltas: 100% (694/694), done.
wzp@DESKTOP-8HFQM2M MINGW64 /e/临时导出/s9-migrate
section9-api.git/  section9-config.git/
wzp@DESKTOP-8HFQM2M MINGW64 /e/临时导出/s9-migrate
$ cd section9-config.git
wzp@DESKTOP-8HFQM2M MINGW64 /e/临时导出/s9-migrate/section9-config.git (BARE:master)
$ git remote set-url --push origin https://code.avlyun.org/victory/section9/config.git
wzp@DESKTOP-8HFQM2M MINGW64 /e/临时导出/s9-migrate/section9-config.git (BARE:master)
$ git push --mirror https://code.avlyun.org/victory/section9/config.git
Counting objects: 1221, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (488/488), done.
Writing objects: 100% (1221/1221), 866.71 KiB | 78.79 MiB/s, done.
Total 1221 (delta 694), reused 1221 (delta 694)
remote: Resolving deltas: 100% (694/694), done.
remote:
remote: To create a merge request for docker-config-paas, visit:
remote:   https://code.avlyun.org/victory/section9/config/-/merge_requests/new?merge_request%5Bsource_branch%5D=docker-config-paas
remote:
remote:
remote: To create a merge request for docker-config-prod, visit:
remote:   https://code.avlyun.org/victory/section9/config/-/merge_requests/new?merge_request%5Bsource_branch%5D=docker-config-prod
remote:
remote:
remote: To create a merge request for docker-config-qa, visit:
remote:   https://code.avlyun.org/victory/section9/config/-/merge_requests/new?merge_request%5Bsource_branch%5D=docker-config-qa
remote:
remote:
remote: To create a merge request for docker-config-staging, visit:
remote:   https://code.avlyun.org/victory/section9/config/-/merge_requests/new?merge_request%5Bsource_branch%5D=docker-config-staging
remote:
remote:
remote: To create a merge request for docker-config-xz, visit:
remote:   https://code.avlyun.org/victory/section9/config/-/merge_requests/new?merge_request%5Bsource_branch%5D=docker-config-xz
remote:
To https://code.avlyun.org/victory/section9/config.git
 + f05c224...d344e8a master -> master (forced update)
 * [new branch]      docker-config-paas -> docker-config-paas
 * [new branch]      docker-config-prod -> docker-config-prod
 * [new branch]      docker-config-qa -> docker-config-qa
 * [new branch]      docker-config-staging -> docker-config-staging
 * [new branch]      docker-config-xz -> docker-config-xz

3.此时查看git bash没有报错,说明镜像推送成功了!去新的gitlab上查看

看看分支、分支的历史提交都在!!!

说明仓库同步完成!

如果后续要更新镜像,推送最新的变更到新仓库可以使用:

如需更新镜像,把源仓库最近的更新,再次同步到新仓库,那么你需要进入你的历史镜像目录,执行:

git remote update

目前还没测试再次同步的有效性!!!

2021年4月9日17:57:05 今天来试试,旧仓库有新的分支创建,叫paas-xizang,需要把这个改动同步到新仓库!

第一步,进入到以前执行git clone --mirror生成的镜像仓库目录

第二步,在此目录打开git bash,执行:git remote -v

确认一下你的镜像仓库的拉取地址和推送地址的正确性

$ git remote -v
origin  http://10.251.9.191/open-v/section9-api.git (fetch)
origin  https://code.avlyun.org/victory/section9/be.git (push)

拉取地址就是旧仓库的地址(当旧仓库有更新时,执行git remote update会去拉取旧仓库的变动);

推送地址就是指这个镜像仓库最终数据同步到哪里!在此,当然是我们的新仓库地址。

第三步,执行:git remote update

$ git remote update
Fetching origin

看到效果没,新增了new branch,顺带看看目录下的文件的时间戳是不是也更改了:

 说明,git remote update生效了,把旧仓库的新改动更新到了镜像仓库文件!

第四步,推送变动到新仓库

$ git push --mirror https://code.avlyun.org/victory/section9/be.git
Counting objects: 11, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (11/11), 5.18 KiB | 2.59 MiB/s, done.
Total 11 (delta 9), reused 3 (delta 2)
remote:
remote: To create a merge request for paas-longyan, visit:
remote:   https://code.avlyun.org/victory/section9/be/-/merge_requests/new?merge                                                                                                                                                                                               _request%5Bsource_branch%5D=paas-longyan
remote:
remote:
remote: To create a merge request for paas-xizang, visit:
remote:   https://code.avlyun.org/victory/section9/be/-/merge_requests/new?merge                                                                                                                                                                                               _request%5Bsource_branch%5D=paas-xizang
remote:
To https://code.avlyun.org/victory/section9/be.git
 - [deleted]           longyan-paas
 * [new branch]        paas-longyan -> paas-longyan
 * [new branch]        paas-xizang -> paas-xizang

注意:这里的push是增量push,句式旧仓库有变动的地方才会同步到新仓库。不是无脑覆盖!!!

关于采坑说明:(只要建立目标仓库时,不要初始化就可以避免这些问题;建立个空仓库来放同步过来的内容,就没得问题)

1.注意新的gitlab的目标服务器如果不是空仓库,包含一个README的受保护的master分支的话,在推送前,需要在gitlab上面把受保护的取消掉

 否则无法推送成功!

2.这个源仓库(执行clone命令的目标仓库)没有master分支,且默认分支不叫master;但是新仓库地址的新建时,执行了init,有默认的master受保护仓库,推送时导致无法推送是因为默认分支不匹配!

在源仓库地址基于受保护的分支新建master分支,然后新仓库把master的受保护取消掉!在推送即可!

否则,报错如下:

wzp@DESKTOP-8HFQM2M MINGW64 /e/临时导出/s9-migrate/section9-config.git (BARE:doc                                                                                                                                                                                               ker-config-prod)
$ git push --mirror https://code.avlyun.org/victory/section9/config.git
Counting objects: 1221, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (488/488), done.
Writing objects: 100% (1221/1221), 866.71 KiB | 86.67 MiB/s, done.
Total 1221 (delta 694), reused 1221 (delta 694)
remote: Resolving deltas: 100% (694/694), done.
remote: GitLab: The default branch of a project cannot be deleted.
To https://code.avlyun.org/victory/section9/config.git
 ! [remote rejected] master (pre-receive hook declined)
 ! [remote rejected] docker-config-paas -> docker-config-paas (pre-receive hook                                                                                                                                                                                                declined)
 ! [remote rejected] docker-config-prod -> docker-config-prod (pre-receive hook                                                                                                                                                                                                declined)
 ! [remote rejected] docker-config-qa -> docker-config-qa (pre-receive hook decl                                                                                                                                                                                               ined)
 ! [remote rejected] docker-config-staging -> docker-config-staging (pre-receive                                                                                                                                                                                                hook declined)
 ! [remote rejected] docker-config-xz -> docker-config-xz (pre-receive hook decl                                                                                                                                                                                               ined)
error: failed to push some refs to 'https://code.avlyun.org/victory/section9/con                                                                                                                                                                                               fig.git'

参考文档:

https://www.jianshu.com/p/076e389ea025

https://stackoverflow.com/questions/3959924/whats-the-difference-between-git-clone-mirror-and-git-clone-bare

https://qastack.cn/programming/6150188/how-to-update-a-git-clone-mirror

背景一个维护了将近三年的php项目,最近需要交给工程组的同事维护,需要把我们成都内网的gitlab仓库的一些项目同步一份到武汉gitlab仓库。可能后续,还会再次同步更新。(成都仓库可能发生新的commit,需要把最新的变动同步到武汉仓库)所以,这里就需要用到git clone --mirror old.git的相关命令,来完成代码仓库的镜像同步操作。最终的效果是,迁移后的仓库内容是包含了现有分支的所有commit、merge等分支上的变动历史记录!这些记录就是这些代码的前世今生!下面正文部 使用常规手段,用旧的本地仓库更换远程仓库地址,然后推送到新的远程仓库中 使用gitlab自带的Mirroring repositories镜像同步的方法去将旧的仓库同步到新的远程仓库上 打开新的远程仓库gitlab页面,找到setting下的repository下的Mirroring repositories 展开后的页面需要填写这两个表单 需要注意的是,旧的远 1. 数据备份: - GitLab数据备份包括对代码仓库、数据库、配置文件和附件等数据的备份。 - 代码仓库可以通过Git命令行工具进行备份,使用`git clone --mirror`命令可以克隆一个完整的裸仓库。 - 数据库可以通过数据库管理工具或者GitLab提供的备份命令进行备份,例如使用`gitlab-rake gitlab:backup:create`命令。 - 配置文件和附件可以直接复制到备份目录中。 2. 数据迁移: - 数据迁移可以是在同一台服务器上进行,也可以是在不同服务器之间进行。 - 在同一台服务器上迁移,可以直接将备份文件恢复到新的GitLab实例中,然后进行相应的配置调整。 - 在不同服务器之间迁移,需要将备份文件复制到目标服务器上,并按照相应的步骤进行恢复和配置。 需要注意的是,在进行GitLab数据备份和迁移之前,建议先停止GitLab服务,以确保数据的一致性和完整性。此外,还需要确保备份文件的安全存储和及时更新。