[Из песочницы] Контроль версий отдельных файлов с использованием 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