Имею свой 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 в гитлаб.