2009-11-08 6 views
12

Я ищу, как импортировать некоторый код третьей части в репозиторий git. Третий сторонний код - это «stm32f10x_stdperiph_lib», который предоставляется ST.Как импортировать стороннюю библиотеку в git?

lib на самом деле является кучей обычных c-файлов (и заголовочных файлов), которые вы просто включаете и создаете, когда выполняете проект STM32.

Проблема в том, что они предоставляют только zip-файл и они выпускают новые версии, поэтому я хотел бы добавить больше элементов управления.

Так что мой план написать небольшой скрипт, который делает это:

  1. разархивировать
  2. захватить некоторые файлы (не нужны все файлы в ZIP)
  3. импортировать выбранные файлы в репозиторий git

Проблемы с запуском на последнем этапе, как мне импортировать и перезаписывать старые файлы с новыми (и удалять файлы, которые больше не включены)?

ответ

24

Что вы ищете - это «ветвь поставщика». Предполагая, что вы хотите работать над этим кодом и объединить обновления вендора с вашими собственными исправлениями, вот как вы делаете это легко.

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.

Теперь вы возвращаетесь к своей разработке (я предполагаю, что мастер) и сливаются с изменениями поставщика.

git checkout master 
git merge vendor 

Сделка с конфликтами как обычно. Ваша исправленная версия теперь обновляется поставщиком. Работайте с мастером как обычно.

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

1

Немного адвоката дьявола здесь, но действительно ли вам это нужно как хранилище git?

Возможно, настроен сценарий, который загружает и обновляет весь сторонний код в ваших проектах? Я думаю, что вы в конечном итоге столкнетесь с зависимостями третьей стороны, которые сложно импортировать. Например, с помощью python я использую buildout для установки всех моих зависимостей. Таким образом, я могу легко комбинировать мерзавец, ртутную, подрывную деятельность, ZIP-файлы, пакеты и т.д.

Однако, что-то вроде должны работать:

$ cd repo 
$ find . -not -path *.git* -and -not -path . -delete 
$ unzip /tmp/thirdparty.zip 
$ git add . 
$ git commit -a 'Updated version' 

То есть, удалить все файлы, кроме .git directory и .gitignore и т. д. Это необходимо для обработки случая удаленных файлов в стороннем проекте. Затем распакуйте обновленный zip-файл в каталог. Добавьте новые файлы в репозиторий. Commit.

Надеюсь, что это поможет! :)

+0

Поскольку они имеют одно и то же имя в zip-файле (даже когда они меняют контент), я чувствую, что просто загрузить распаковку и надеяться на лучшее. – Johan

+1

Я вижу. Тем не менее, вам не нужно загружать его из Интернета. Вы можете получить его с внутреннего сервера, который содержит только проверенные и одобренные версии. – lemonad

+1

Почему бы не использовать 'git clean' вместо использования' find' для удаления старой версии? –

0

Мое предпочтение - создать репозиторий git, периодически обновлять его (git commit -a -m 'Update') и просто связывать его в моих проектах (как каталог (ln -s, junction и т. Д.) Или как разделяемая библиотека). Для файлов, которые вам не нужны, используйте .gitignore.

+0

Это похоже на его план, но он просит о помощи в замене старых файлов новым, добавлением и удалением по мере необходимости. Также обратите внимание, что некоторые проекты поставляются с .gitignore. – ysth

Смежные вопросы