Контроль версій окремих файлів з використанням GitHub Gist
Часто буває так, що у розробника з-часом накопичується деяка колекція коду який він використовує в своїх проектах.
Одні скрипти він використовує в одних проектах, інші в інших.
Ці скрипти з-часом удосконалюються, прибираються баги, оптимізуються. Тому постає питання, як синхронізувати нові версії скриптів з тими, які в проектах.
Тут є кілька варіантів:
Перший варіант:
Створити один репозиторій і помістити туди всі скрипти. Потім цей репозиторій підключається як підмодуль до проекту і використовується.
Мінуси:
- у проект копіюються всі скрипти включаючи непотрібні.
- підмодуль не commit-ится в репозиторій проекту, тому якщо буде недоступний віддалений репозиторій подмодуля, то ми не зможе викачати проект цілком.
Другий варіант:
Кожен скрипт окремо зберігати на Github gist і підключати потрібні як підмодулі
Мінус той-же, що і в першому варіанті у другому пункті.
Третій варіант:
Використовувати Git Subtree.
(Дане рішення є альтернативою для Git submodules)
Git subtree — ще один з методів злиття гілок. Його ідея полягає в тому, що маючи дві гілки, git буде розуміти, що одна гілка — це не різновид інший, а доповнення.
Загальна суть ідеї:
- — додаємо файл на Github gist (генерується міні-репозиторій)
- — прив’язуємо міні-репозиторій до нашого проекту у вигляді окремої гілки
- — призначаємо папку для цієї гілки
- — викачуємо.
- — далі працюємо як з звичайної гілкою (merge, commit, fetch…)
Тепер подробиці з використанням Git-extensions.
1) Публікуємо наш файл з кодом на https://gist.github.com де відразу можемо отримати посилання на «міні»-репозиторій:
Відкриваємо репозиторій нашого проекту в GitExtensions і вибираємо:
[Repository] -> [Remote repositories…]
Підключаємо як окрему гілку.
Для цього натискаємо [+]. Вводимо [Name], [Url] і зберігаємо [Save changes]:
$git remote add "Util1" "https://gist.github.com/cf056e792d3bd9c2fc5973b846efe3d3.git"
Бачимо, що підключилися до віддаленого сховища.
Далі нам потрібно зв’язати цю гілку з певною папкою в нашому проекті, щоб файл копіювався туди.
Для цього відкриваємо Git-bash(ctrl+G) і виконуємо команду:
$git read-tree --prefix=Client/Assets/ -u Util1/master
де:
Client/Assets/ — шлях до папки, в яку буде копіюватися файл
Util1/master — ім’я гілки віддаленого сховища
(через UI не знайшов способу)
Gist-гілка стає прив’язана до нашої папці у проекті. І файл вже там.
Тепер можемо працювати як зі звичайною гілкою.
Наприклад, якщо в Gist файл змінюється, ми може отримати нову версію:
Робимо Fetch All і бачимо всі зміни:
$git fetch --progress "--all"
Потім робимо злиття, щоб залити зміни в нашу гілку:
$git merge --no-ff --allow-unrelated-histories Util1/master
Результат:
Додаткова інформація:
https://git-scm.com/book/ru/v1/Инструменты-Git-Слияение-поддеревьев
https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree
https://www.nwcadence.com/blog/git-subtrees