#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
).