Как отразить один экземпляр GitLab в другой, применяя при этом некоторые простые правила перезаписи?

#git #url-rewriting #gitlab #migration #hook

# #git #url-перезапись #gitlab #миграция #крюк

Вопрос:

Мы столкнулись со следующим случаем использования: внешний поставщик разрабатывает проект, который состоит из нескольких репозиториев (около 40) в их экземпляре GitLab. Мы хотели бы стать зеркалом (подчиненным) их GitLab (master). Однако нам также необходимо применить некоторые простые правила перезаписи на нашей стороне (замена некоторых URL-адресов и идентификаторов, что можно сделать с помощью простого скрипта). Как лучше всего подойти к этому вопросу?

Мне удалось настроить зеркальное отображение на основе push-запросов с использованием токенов доступа к проекту, что работает как по волшебству. Однако это не позволяет мне применять какие-либо правила переписывания.

Для нас также было бы полезно иметь для каждой из ветвей поставщика (или просто master ветки) в каждом из их 40 репозиториев теневую ветку в репозитории поставщика с переписанным кодом. Т.Е. переписать эти URL-адреса / идентификаторы на стороне поставщика не будет проблемой. Как настроить это бесконфликтно с помощью git-хуков, например, при каждом нажатии? Или у вас есть идея получше?

Спасибо!

Ответ №1:

Мне удалось решить эту проблему, используя токены доступа к проекту и запустив сценарий перезаписи git merge , а git push также внутри задания GitLab CI / CD (на стороне поставщика). Что-то вроде:

 # 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
 

Это автоматическое решение, которое работает для любой ветки, а также для крайних случаев (новое репозиторий, новая ветка и т.д.). Теги покрываются. Для этого требуется, чтобы вы заранее создали соответствующий подчиненный репозиторий и настроили токен доступа к проекту (с write_repository разрешением) внутри него ( $GIT_PASSWORD ).