如何将一个 GitLab 实例镜像到另一个实例,同时沿途应用一些简单的重写规则?
How to mirror one GitLab instance to another, while applying some simple rewrite rules along the way?
我们面临以下用例:一个外部供应商正在开发一个项目,该项目由他们的 GitLab 实例中的多个存储库(大约 40 个)组成。我们想成为他们的 GitLab(主人)的镜像(奴隶)。但是,我们还需要在我们这边应用一些简单的重写规则(替换一些 URL 和标识符,这可以用一个简单的脚本来完成)。解决这个问题的最佳方法是什么?
我已经能够使用项目访问令牌设置基于推送的镜像,这非常有效。不过,它不允许我应用任何重写规则。
对于我们的每个供应商分支机构(或只是 master
分支机构)在他们的 40 个回购中的每个分支机构,一个 shadow使用重写的代码在供应商回购中分支。也就是说,在供应商端重写那些 URLs/identifiers 是没有问题的。如何使用 git 挂钩以无冲突的方式进行设置,例如在每次推动?或者你有更好的主意吗?
谢谢!
我设法使用项目访问令牌和 运行 重写脚本以及 GitLab CI/CD 作业中的 git merge
和 git push
解决了这个问题(在供应商方面) .大致如下:
# setup git credentials
print "https://${GIT_USER}:${GIT_PASSWORD}@${GIT_HOST}\n" >> /root/.git-credentials
git config --global credentials.helper 'store --file=/root/.git-credentials'
# clone the slave (our) repo (works because of the credentials set above)
git clone slave-repo-url
# checkout the commit branch in question (might already exist or not)
git checkout -B branch --track origin/branch || git checkout -b branch
# add a new remote (vendor)
git remote add --tags vendor vendor-repo-url
# pull from the vendor branch
# note: this uses a recursive merge strategy but this is fine
git pull --no-edit -X theirs vendor branch
# rewrite the files; create the rewrite commit
# ...
# push the changes back to the origin (our slave)
git push --tags --set-upstream origin branch
这是一个自动解决方案,适用于任何分支,也适用于边缘情况(新回购、新分支等)。标签被覆盖。它需要你事先创建相应的slave repo,并在其中配置一个项目访问令牌(具有write_repository
权限)($GIT_PASSWORD
)。
我们面临以下用例:一个外部供应商正在开发一个项目,该项目由他们的 GitLab 实例中的多个存储库(大约 40 个)组成。我们想成为他们的 GitLab(主人)的镜像(奴隶)。但是,我们还需要在我们这边应用一些简单的重写规则(替换一些 URL 和标识符,这可以用一个简单的脚本来完成)。解决这个问题的最佳方法是什么?
我已经能够使用项目访问令牌设置基于推送的镜像,这非常有效。不过,它不允许我应用任何重写规则。
对于我们的每个供应商分支机构(或只是 master
分支机构)在他们的 40 个回购中的每个分支机构,一个 shadow使用重写的代码在供应商回购中分支。也就是说,在供应商端重写那些 URLs/identifiers 是没有问题的。如何使用 git 挂钩以无冲突的方式进行设置,例如在每次推动?或者你有更好的主意吗?
谢谢!
我设法使用项目访问令牌和 运行 重写脚本以及 GitLab CI/CD 作业中的 git merge
和 git push
解决了这个问题(在供应商方面) .大致如下:
# setup git credentials
print "https://${GIT_USER}:${GIT_PASSWORD}@${GIT_HOST}\n" >> /root/.git-credentials
git config --global credentials.helper 'store --file=/root/.git-credentials'
# clone the slave (our) repo (works because of the credentials set above)
git clone slave-repo-url
# checkout the commit branch in question (might already exist or not)
git checkout -B branch --track origin/branch || git checkout -b branch
# add a new remote (vendor)
git remote add --tags vendor vendor-repo-url
# pull from the vendor branch
# note: this uses a recursive merge strategy but this is fine
git pull --no-edit -X theirs vendor branch
# rewrite the files; create the rewrite commit
# ...
# push the changes back to the origin (our slave)
git push --tags --set-upstream origin branch
这是一个自动解决方案,适用于任何分支,也适用于边缘情况(新回购、新分支等)。标签被覆盖。它需要你事先创建相应的slave repo,并在其中配置一个项目访问令牌(具有write_repository
权限)($GIT_PASSWORD
)。