Как сделать mirror github-репозитория на бесплатной версии selfhosted GitLab

Как сделать mirror github-репозитория на бесплатной версии selfhosted GitLab

Имею свой Gitlab, установленный на виртуальной машине в proxmox-кластере. Помимо своих домашних проектов возникла мысль сделать зеркалирование каких-то open-source проектов, которые интересно наблюдать, а также для того, чтобы сохранить их код на случай какого-либо блокирования.

В платной версии GitLab есть возможность зеркалирования внешних репозиториев «из коробки», а в бесплатной (каковая установлена у меня) этой фичи нет, что было бы весьма удобно.

Мне пришла идея в голову, как бы можно было зеркалировать репозитории подручными средствами. Для этого можно воспользоваться тем свойством, что git позволяет для одного и того же репозитория добавлять разные remotes. Это удобно, например, при удаленной работе, когда в определенные моменты нет возможности синхронизировать какой то центральный репозиторий. Также git позволяет настроить адреса remote отдельно для обновления (fetch) и для публикации (push). Посмотреть текущие настройки проекта можно командой в консоли (на примере проекта Borg Backup):

git remote -v

Результат выполнения команды выглядит примерно так:

origin	https://github.com/borgbackup/borg.git (fetch)
origin	https://github.com/borgbackup/borg.git (push)

Здесь видно, что и для получения и для обновления данных используется один и тот же адрес репозитория на GutHub. Мы можем изменить настройки для push, подставив адрес склонированного ранее репозитория Borg Backup в своем гитлабе (об этом будет отдельная статья) с помощью команды:

git remote set-url --push origin git@<own_gitlaburl>:<some_groups>/borg.git

После этого, если выполнить команду git remote -v, то мы увидим примерно следующую картину:

origin	https://github.com/borgbackup/borg.git (fetch)
origin	git@gitlab.artur-gareev.ru:mirrors/borg.git (push)

таким образом, забирать изменения мы будем из гитхаба командой git pull, а обновлять свое гитлаб-зеркало с помощью команды git push origin. Так мы получим всю оригинальную историю коммитов и актуальное состояние кода.

Минусы у данного подхода:

  • необходимость промежуточного скачивания репозитория, где бы можно было производить манипуляции с remote url;
  • необходимость ручных действий: сначала прописать push-url, а затем вручную делать git pull/git push, когда необходимо сделать синхронизацию.

Последнюю часть с обновлением можно было бы автоматизировать путем написания какого-либо скрипта, который бы выкачивал изменения с гитхаба и делал бы git push в гитлаб.

Back To Top