2009-11-08 9 views
12

Sto cercando come importare alcuni codici di terze parti in un repository git. Il codice di terze parti è "stm32f10x_stdperiph_lib" fornito da ST.Come posso importare una lib di terze parti in git?

La lib è in realtà una serie di normali file c (e file di intestazione) che è possibile includere e creare solo quando si esegue un progetto STM32.

Il problema è che lo forniscono solo come file zip e rilasciano nuove versioni, quindi vorrei aggiungere più controllo.

Quindi il mio piano è quello di scrivere un piccolo script che fa questo:

  1. decomprimere
  2. afferrare alcuni dei file (non ho bisogno di tutti i file zip)
  3. importare il file selezionati in un repository git

I miei problemi iniziano all'ultimo passaggio, come posso importare e sovrascrivere i vecchi file con quelli nuovi (e rimuovere i file che non sono più inclusi)?

risposta

24

Quello che stai cercando è un "distributore". Supponendo che tu voglia lavorare su questo codice e unire gli aggiornamenti del venditore con le tue patch, ecco come rendi tutto ciò facile.

git checkout -b vendor # create a vendor branch and check it out 

Questa è una cosa una volta. Il ramo del venditore e il suo SOLO intenzione di contenere gli aggiornamenti dal fornitore di terze parti. Non lavori mai nel ramo del venditore, contiene una cronologia pulita del codice del venditore. Non c'è nulla di magico nel nome "vendor", è solo la mia terminologia che trattiene da CVS.

Ora inseriremo l'ultima versione dal fornitore.

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 

Prima eliminiamo tutto in modo che git possa vedere le cose eliminate dal fornitore. la capacità di git di vedere le delezioni e indovinare i file spostati rende questa procedura molto più semplice rispetto a Subversion.

Ora si ritorna al proprio sviluppo (presumo che sia un master) e si unisca alle modifiche del fornitore.

git checkout master 
git merge vendor 

Gestire eventuali conflitti normalmente. La versione con patch è ora aggiornata con il fornitore. Lavora su master come al solito.

La prossima volta che c'è una nuova versione dal fornitore, ripetere la procedura. Questo sfrutta l'eccellente fusione di git per mantenere aggiornate le patch con le modifiche del fornitore.

1

Un po 'di avvocato del diavolo qui ma ne hai davvero bisogno come repository git?

Forse impostare uno script che scarica e aggiorna il codice di terze parti nei progetti invece? Il mio pensiero è che alla fine incapperai in dipendenze di terze parti che sono difficili da importare. Ad esempio, con python uso buildout per installare tutte le mie dipendenze. In questo modo posso facilmente combinare git, mercuriale, la sovversione, file zip, pacchetti, ecc

Tuttavia, qualcosa come il seguente dovrebbe funzionare:

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

Cioè, eliminare tutti i file ad eccezione il .git directory e .gitignore, ecc. Questo per gestire il caso di file cancellati nel progetto di terze parti. Quindi decomprimere il file zip aggiornato nella directory. Aggiungi eventuali nuovi file al repository. Commettere.

Spero che questo aiuti! :)

+0

Dal momento che hanno lo stesso nome sul file zip (anche quando cambiano il contenuto), ritengo sia pericoloso scaricare solo unpack e sperare per il meglio. – Johan

+1

Vedo. Tuttavia, non è necessario scaricarlo da internet. È possibile scaricarlo da un server interno che contiene solo versioni testate e approvate. – lemonad

+1

Perché non usare 'git clean' invece di usare' find' per cancellare la vecchia versione? –

0

La mia preferenza è creare un repository git, aggiornarlo periodicamente (git commit -a -m 'Update') e collegarlo semplicemente nei miei progetti (come una directory (ln -s, junction, ecc.) O come libreria condivisa). Per i file che non ti servono, usa .gitignore.

+0

Sembra esattamente il suo piano, ma sta chiedendo aiuto su come sostituire i vecchi file con il nuovo, aggiungendo ed eliminando se necessario. Si noti inoltre che alcuni progetti sono dotati di .gitignore. – ysth