Решил слегка “причесать” и обобщить свой опыт по этому вопросу. Чтобы удобней было пользоваться, как этакой краткой инструкцией, а не искать разрозненные ответы на SO и т.п.
Задача проста – сделать удобно 🙂
- Взять GitLab (много где используется, как self-hosted) и выкачать с него все репозитории проекта. Чтобы можно было локально работать с ними, не загружая каждый отдельно.
- Обновлять эти репозитории одной командой
Загрузка списка репозиториев с GitLab
Тут всё несложно – надо получить сам список и по нему всё скачать. Удобнее это делать с использованием ssh ключа (добавляется в GitLab через веб-интерфейс). Но можно и git credentials включить. Сам список достаточно просто в браузере открыть и сохранить projects.json (название по умолчанию).
- Список репозиториев:
https://your-gitlab-host/api/v4/projects?per_page=1000
- Или список для группы проектов:
https://your-gitlab-host/api/v4/groups/{group-id}/projects?per_page=1000
group-id
можно тоже через веб-интерфейс посмотреть, примерно так:
- Выкачать (в текущий каталог) репозитории по списку из файла:
jq -r '.[].ssh_url_to_repo' < /path/to/projects.json | xargs -n1 git clone
. Можно аналоги утилитыjq
использовать, мне она привычней. - Если авторизация по ssh-ключу не настроена – придется из json вместо поля
ssh_url_to_repo
извлекать полеhttp_url_to_repo
. Можно хранить логин/пароль для GitLab в~/.git-credentials
(там они лежат в открытом виде!).
Первая часть на этом закончена. На очереди – обновление репозиториев.
Обновление списка репозиториев
Здесь всё ещё проще – достаточно одной команды. Перейти в каталог со склонированными репозиториями и выполнить:
find . -type d -name '.git' \
| xargs -n1 -- sh -c \
'cd "${0}/.." && echo \
&& basename -sa $(git rev-parse --show-toplevel) \
&& git pull --all'
Найдёт все каталоги с директорией .git
внутри (а это и есть репозитории) и обновит их через git pull --all
. Соответственно, каталоги, не являющиеся репозиториями, будут проигнорированы. Готово!