Как легче ссылаться на сторонние источники в git? - PullRequest
0 голосов
/ 01 ноября 2018

Около года назад я реализовал стратегию git для управления сторонней библиотекой, основанную на общении с сообществом. Я был очень новичком в то время. Это потребовало создания сиротского узла, добавления исходного кода и слияния его с нашим исходным кодом. Команды следующие (из моих заметок):

cd /path/to/our/modified/source/directory              #1
git checkout --orphan vendor
rm -rf *                                               #2
cp -R /path/to/original/distribution/version/* .       #3
git add .                                              #4
git commit -m 'vendor vVersion'
git checkout merge-branch                              #5
rm -rf *
git reset --hard
git merge --allow-unrelated-histories -s ours vendor   #6

Это приводит к следующей истории:

         ...A0--A1-...             dev
             \ /           
              C0                   merge-branch (transient)
             /           
            B0                     vendor

Обратите внимание , что merge-branch - это переходная ветвь, которая удаляется после объединения обратно в ветвь dev. Шверн назвал эту ветку feature, но название не имеет значения, так как не имеет реальной истории. Это переходная ветвь, используемая только в рабочем процессе.

Идея состояла в том, чтобы я потом добавил в ветку вендор, а затем снова слил со следующими командами (из моих заметок):

cd /path/to/our/modified/source/directory              #1
git checkout vendor
rm -rf *                                               #2
cp -R /path/to/original/distribution/version/* .       #3
git add .                                              #4
git commit -m 'vendor vVersion'
git checkout merge-branch                              #5
git merge vendor                                       #6

В результате:

         ...A0--A1-...-Ax--Ay--... dev
             \ /        \ /
              C0         Cz        merge-branch (transient)
             /          /
            B0---...---Bw--...     vendor

Теперь пришло время добавить новую версию стороннего источника. Однако может показаться, что ветка vendor пропала, или мои записи неверны. Я обнаружил, что если бы не сообщение о коммите, я бы вообще не смог найти ветку. Предполагается, что ветка B работает параллельно основной ветке источника A. Однако теперь, когда я думаю об этом, я не уверен, как это сделать.

Я мог бы изменить git checkout vendor на git checkout <B0-hash>, но это не имеет смысла, так как версия B0 нашего источника была бы версией A0. Так как мне обновить его до версии Ax? Или мне чего-то не хватает, чего я тогда не записал?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Сделать продавца клон

Вместо того, чтобы поддерживать ветку поставщика, поддержите поставщика клон . Создайте свой собственный клон git из сторонней библиотеки. Заплатите его и обновляйте, как в любом другом репозитории. Это четко отделяет поддержку вашего проекта от поддержки вашей вилки сторонней библиотеки. Вы можете запустить полный набор тестов для своих изменений, легко получать обновления из апстрима и даже делиться своей работой в апстриме.

Если у вас есть сторонняя библиотека в собственном репозитории, вы можете управлять ею как зависимостью с помощью существующих инструментов.

Использовать менеджер зависимостей

Эта сторонняя библиотека является зависимостью, и зависимости лучше обрабатываются менеджерами зависимостей, чем хиты Git. Хороший менеджер зависимостей решит эту проблему для вашего проекта.

То, что вы используете, зависит от вашего языка, структуры и обстоятельств. Многие могут зависеть напрямую от вашего клона Git и даже от конкретных веток и тегов. Например, здесь Bundler Руби в зависимости от nokogiri извлечения из репозитория Git в https://github.com/rack/rack.git и его ветви rack-1.5.

gem 'nokogiri', git: 'https://github.com/rack/rack.git', branch: 'rack-1.5'

Если ваш менеджер зависимостей не обрабатывает Git-репозитории, возможно, он сможет собрать из архива или вам придется создавать пакеты. Оно того стоит.

Подмодули Git

Если подходящего менеджера зависимостей нет, вы можете использовать Git submodules . Свяжите клон вашего поставщика в ваш проект как подмодуль.

git submodule add https://git.example.com/3rdparty/project_name vendor/project_name

Теперь vendor/party_project/ появится в вашем подкаталоге, содержащем стороннюю библиотеку. Вы можете контролировать, какой коммит извлекается и обновлять его по мере необходимости.

Подмодули усложняют работу с вашим проектом. Реальный менеджер зависимостей предпочтительнее.

0 голосов
/ 01 ноября 2018

Оформить последний узел в B ветви и затем выполнить команду git checkout -b vendor. Это сделает этот узел ГОЛОВНОЙ ветвью vendor. Все остальное должно работать как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...