Как мне импортировать стороннюю библиотеку в git?
-
18-09-2019 - |
Вопрос
Я рассматриваю, как импортировать некоторую стороннюю часть кода в репозиторий git.Сторонним кодом является "stm32f10x_stdperiph_lib", который предоставляется ST.
Библиотека на самом деле представляет собой набор обычных c-файлов (и заголовочных файлов), которые вы просто включаете и создаете, когда выполняете STM32 проект.
Проблема в том, что они предоставляют его только в виде zip-файла и они выпускают новые версии, поэтому я хотел бы добавить больше контроля.
Итак, мой план состоит в том, чтобы написать небольшой скрипт, который делает это:
- распаковать молнию
- возьмите несколько файлов (мне не нужны все файлы в zip-архиве).
- импортируйте выбранные файлы в репозиторий git
Мои проблемы начинаются с последнего шага: как мне импортировать и перезаписать старые файлы новыми (и удалить файлы, которые больше не включены)?
Решение
То, что вы ищете, - это "филиал поставщика".Предполагая, что вы хотите поработать над этим кодом и объединить обновления поставщика со своими собственными исправлениями, вот как это можно упростить.
git checkout -b vendor # create a vendor branch and check it out
Это всего лишь один раз.Ветка поставщика, и она будет содержать обновления ТОЛЬКО от стороннего поставщика.Вы никогда не выполняете работу в ветке поставщика, она содержит чистую историю кода поставщика.В названии "поставщик" нет ничего волшебного, это просто моя терминология, заимствованная из CVS.
Теперь мы поместим туда последнюю версию от производителя.
find . -not -path *.git* -and -not -path . -delete # delete everything but git files
dump the 3rd party code into the project directory # I'll leave that to you
git add . # add all the files, changes and deletions
git commit -a -m 'Vendor update version X.YY' # commit it
git tag 'Vendor X.YY' # optional, might come in handy later
Сначала мы удаляем все, чтобы git мог видеть то, что удалил поставщик.способность git видеть удаления и угадывать перемещенные файлы делает эту процедуру намного проще, чем в Subversion.
Теперь вы возвращаетесь к своей разработке (я предполагаю, что master) и объединяете изменения поставщика.
git checkout master
git merge vendor
Разбирайтесь с любыми конфликтами как обычно.Теперь ваша исправленная версия обновлена у поставщика.Работайте с мастером в обычном режиме.
В следующий раз, когда появится новая версия от поставщика, повторите процедуру.Это использует преимущества превосходного слияния git, чтобы поддерживать ваши исправления в курсе изменений поставщика.
Другие советы
Здесь немного от адвоката дьявола, но действительно ли вам это нужно как репозиторий git?
Возможно, вместо этого настройте скрипт, который загружает и обновляет весь сторонний код в ваших проектах?Я думаю, что в конечном итоге вы столкнетесь со сторонними зависимостями, которые сложно импортировать.Например, в python я использую buildout для установки всех своих зависимостей.Таким образом, я могу легко комбинировать git, mercurial, subversion, zip-файлы, пакеты и т.д.
Однако должно сработать что-то вроде следующего:
$ cd repo
$ find . -not -path *.git* -and -not -path . -delete
$ unzip /tmp/thirdparty.zip
$ git add .
$ git commit -a 'Updated version'
То есть удалить все файлы за исключением тот самый .git
каталог и .gitignore
, и т.д.Это сделано для того, чтобы обработать случай с удаленными файлами в стороннем проекте.Затем распакуйте обновленный zip-файл в каталог.Добавляйте любые новые файлы в репозиторий.Совершить.
Надеюсь, это поможет!:)
Я предпочитаю создавать репозиторий git, периодически обновлять его (git commit -a -m 'Update') и просто связывать его в моих проектах (как каталог (ln -s, junction и т.д.) Или как общую библиотеку).Для файлов, которые вам не нужны, используйте .gitignore .
Я новичок в Git, но разве что-то вроде Piston не было бы лучшим решением? http://piston.rubyforge.org/