image

Часто бывает так, что у разработчика со-временем накапливается некоторая коллекция кода который он использует в своих проектах.

Одни скрипты он использует в одних проектах, другие в других.

Эти скрипты со-временем совершенствуются, убираются баги, оптимизируются. Поэтому появляется вопрос, как синхронизировать новые версии скриптов с теми, которые в проектах.

Тут есть несколько вариантов:

Первый вариант:

Создать один репозиторий и поместить туда все скрипты. Затем этот репозиторий подключается как подмодуль к проекту и используется.

Минусы:

  1. в проект копируются все скрипты включая ненужные.
  2. подмодуль не commit-ится в репозиторий проекта, поэтому если будет недоступен удаленный репозиторий подмодуля, то мы не сможет выкачать проект целиком.

Второй вариант:

Каждый скрипт отдельно хранить на Github gist и подключать нужные как подмодули
Минус тот-же, что и в первом варианте во втором пункте.

Третий вариант:

Использовать Git Subtree.

(Данное решение является альтернативой для Git submodules)

Git subtree — ещё один из методов слияния веток. Его идея состоит в том, что имея две ветки, git будет понимать, что одна ветка — это не разновидность другой, а дополнение.

Общая суть идеи:

  1. — добавляем файл на Github gist (генерируется мини-репозиторий)
  2. — привязываем мини-репозиторий к нашему проекту в виде отдельной ветки
  3. — назначаем папку для этой ветки
  4. — выкачиваем.
  5. — далее работаем как с обычной веткой (merge, commit, fetch...)

Теперь подробности с использованием Git-extensions.

1) Публикуем наш файл с кодом на https://gist.github.com где сразу можем получить ссылку на «мини»-репозиторий:

image

Открываем репозиторий нашего проекта в GitExtensions и выбираем:

[Repository] -> [Remote repositories...]

image

Подключаем как отдельную ветку.

Для этого нажимаем [+]. Вводим [Name], [Url] и сохраняем [Save changes]:

$git remote add "Util1" "https://gist.github.com/cf056e792d3bd9c2fc5973b846efe3d3.git"

image

Видим, что подключились к удаленному репозиторию.

Далее нам нужно связать эту ветку с определенной папкой в нашем проекте, чтобы файл копировался туда.

Для этого открываем 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 -s subtree --no-ff --allow-unrelated-histories Util1/master

image

image

Результат:

image

Дополнительная информация:

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

Комментарии (2)


  1. smple
    12.08.2018 01:22

    а вариант сложить свои "скрипты" в библиотеку и подключать к проекту в виде библиотеки? с помощью пакетного менеджера языка.


    1. Graf54r
      12.08.2018 07:53

      это же первый вариант