9.3 KiB
Дзеркалювання репозиторію Git з локальними залежностями .gitmodules в Radicle
Створюючи дзеркала репозиторіїв, зокрема в локальних мережах типу Yggdrasil, майнтейнери часто забувають про дзеркалювання залежностей: наприклад, .gitmodules.
З цієї причини, користувач, який розгортає середовище розробки для збірки програми, мусить звертатись на "зовнішні" URL. Якщо в нього відсутній Інтернет, це може спричинити незручності у вигляді ручного "розв'язання" таких адрес - проксуванням або копіюванням з оптичного драйву чи флешки.
З іншого боку, дзеркала (на відміну від проксі) часто створюються на випадок "падіння" першоджерела, тому важливо подбати про повноцінну копію, щоб не загубити жодного пазлу, без якого збірка буде не можливою.
Отже, розглянемо як правильно організувати дзеркало репозиторіїв в мережі Radicle, щоб залежності підтягувались автоматично. У прикладі будемо використовувати репозиторій Source engine 2017 року.
Публікація .gitmodules
Спочатку потрібно забрати сорс з кореневого апстріму, з рекурсивним підвантаженням його модулів:
git clone --recursive https://github.com/nillerusr/source-engine.git
cd source-engine
Тепер шукаємо всі локальні файли .gitmodules - в source-engine таких два:
$ find . -name ".gitmodules" -o -path .
.
./.gitmodules
./thirdparty/freetype/.gitmodules
Заходимо в кожен знайдений файл .gitmodules і публікуємо окремі дзеркала для кожного url:
- виконуємо
git clone URL - з теки кожного модуля, ініціалізуємось з
rad init - замість URL в
.gitmodulesвказуємо згенерований RID
[submodule "thirdparty"]
path = thirdparty
url = rad://z2v4ViM5Eyd7gRVcdXDYQXFZfw1CR
branch = rad
[submodule "ivp"]
path = ivp
url = rad://z2wtznZZ8Q5VeoPXeieHPbk4uketL
[submodule "lib"]
path = lib
url = rad://z2NfvnmPgsFpGg5abyvEbfmnjLAWb
- модуль
thirdpartyвикористовує гілкуrad, в якій ми оголосили залежністьdlg
[submodule "dlg"]
path = subprojects/dlg
url = rad://z2eMXuSXHUCGHx1w8Hnsnep5VdhEx
Зверніть увагу, що в url потрібно вказувати саме схему rad:// замість префіксу rad:!
Відповідно, всі ці RID ініціюються окремо, у своїх теках, але приклади нижче для них спільні.
Канонічні посилання (crefs)
Зміни я публікую окремою гілкою, щоб залишити оригінальний master для подальших апдейтів з git pull. Але перш, як створити її, потрібно спочатку ознайомитись з поняттям Canonical References, інакше додану гілку не буде видно після клонування репозиторію користувачем.
Це важливо зробити саме до дії push, інакше доведеться вказувати залежності .gitmodules з прив'язкою до простору імен користувача (Radicle має децентралізоване дерево контрибуторів, які видно при перегляді стандартної гілки master зокрема у Web UI).
В прикладах нижче, буде розглядатись гілка з назвою rad. Якщо з якихось причин таку гілку було створено раніше, її потрібно видалити (через баг синхронізації ноди, що заважатиме потім)
git branch --delete rad
git push rad --delete rad
Тепер відкриваємо профіль проєкту командою:
rad id update --edit
І додаємо себе до xyz.radicle.crefs, що є дочірнім елементом payload:
{
"payload": {
"xyz.radicle.crefs": {
"rules": {
"refs/heads/rad": {
"allow": [
"did:key:z6Mkh1AhzGE5H7CxeCMLYy4BdYjcsjRy3Do4yhQfigdVvwes"
],
"threshold": 1
}
}
},
"xyz.radicle.project": {
"defaultBranch": "master",
"description": "Source third-party (mirror of https://github.com/nillerusr/source-thirdparty)",
"name": "source-thirdparty"
}
},
"delegates": [
"did:key:z6Mkh1AhzGE5H7CxeCMLYy4BdYjcsjRy3Do4yhQfigdVvwes"
],
"threshold": 1
}
- свій DID можна отримати командою
rad self --did - зверніть увагу на відповідність вашій гілці
refs/heads/radбо зrefs/heads/*в мене не вийшло
Зберігаємо цей файл, і якщо він не містить помилок, буде запропоновано здійснити коміт. В опис коміту я пишу щось накшталт "update crefs".
Публікація гілки
Виконавши оновлення політики Канонічних посилань:
git checkout -b rad
Комітимо і публікуємо патч.gitmodules, в рамках створеної гілки rad:
git add .gitmodules
git commit -m 'init radicle mirror'
git push --set-upstream rad rad
Тестування гілки
Оскільки поточний інтерфейс Web UI нічого не покаже, перевіряти потрібно командним рядком:
git ls-remote rad://z2v4ViM5Eyd7gRVcdXDYQXFZfw1CR
- в результуючому списку має бути наявною гілка
refs/heads/rad
Також, можна переглянути наявність гілки rad командою:
$ git branch -r
rad/master
rad/rad
Відповідно, тепер залежності .gitmodules зможуть підвантажитись, використовуючи окрему гілку rad стандартними засобами Git.
Отримання .gitmodules
Щоб клієнт Git зміг отримати залежності .gitmodules виключно засобами налаштованої маршрутизації Radicle, йому потрібно додати виключення на протокол rad:// (вказували в url). Робити виключення потрібно саме глобально (--global) оскільки ініціалізація модулів відбувається в просторі їх поточної теки:
git config --global protocol.rad.allow always
git config --global protocol.file.allow always
Для обробки протоколу rad://, клієнт повинен мати встановлений компонент git-remote-rad:
$ which git-remote-rad
~/.radicle/bin/git-remote-rad
- цей компонент є частиною стандартної ноди
Виконавши вказані вимоги, можна розгорнути проєкт виключно засобами дзеркала в мережі Radicle:
rad clone rad:z33AAz3Gvu2m8HEsncgPiwRRwRYu6 source-engine
cd source-engine
git checkout rad
git submodule update --init --recursive
- далі виконується збірка, згідно інструкцій README