2009-11-08 21 views
12

Estoy buscando cómo importar un código de tercera parte en un repositorio de git. El código de terceros es el "stm32f10x_stdperiph_lib" proporcionado por ST.¿Cómo importo una lib de terceros en git?

La lib es en realidad un montón de c-files normales (y archivos de encabezado) que acaba de incluir y compilar cuando hace un proyecto STM32.

El problema es que solo lo proporcionan como un archivo comprimido y publican nuevas versiones, por lo que me gustaría agregar más control.

Así que mi plan es escribir un pequeño script que hace esto:

  1. descomprima
  2. agarrar algunos de los archivos (no necesito todos los archivos en el zip)
  3. importar el archivos seleccionados en un repositorio git

Mis problemas comienzan en el último paso, ¿cómo importo y sobreescribo los archivos antiguos con los nuevos (y elimino los archivos que ya no están incluidos)?

Respuesta

24

Lo que está buscando es una "rama de proveedor". Suponiendo que quiera trabajar en este código y combinar las actualizaciones del proveedor con sus propios parches, así es cómo lo hace fácil.

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

Eso es algo único. La rama del proveedor y SÓLO va a contener actualizaciones del proveedor de terceros. Nunca trabaja en la sucursal del proveedor, contiene un historial limpio del código del proveedor. No hay nada de mágico en el nombre de "proveedor", es solo mi terminología de CVS.

Ahora vamos a poner la última versión del proveedor allí.

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 

Primero eliminamos todo para que git pueda ver las cosas que el vendedor eliminó. La capacidad de git para ver eliminaciones y adivinar archivos movidos hace que este procedimiento sea mucho más simple que con Subversion.

Ahora vuelve a su desarrollo (supongo que maestro) y se funde en los cambios del proveedor.

git checkout master 
git merge vendor 

Trate de cualquier conflicto de forma normal. Su versión parchada ahora está actualizada con el proveedor. Trabaja en el maestro como siempre.

La próxima vez que haya una nueva versión del proveedor, repita el procedimiento. Esto aprovecha la excelente fusión de git para mantener sus parches actualizados con los cambios del proveedor.

1

Un poco de abogado del diablo aquí, pero ¿realmente lo necesita como repositorio git?

¿Tal vez configuró un script que descarga y actualiza todos los códigos de terceros en sus proyectos? Mi opinión es que eventualmente se encontrará con dependencias de terceros que son difíciles de importar. Por ejemplo, con python utilizo buildout para instalar todas mis dependencias. De esa manera puedo combinar fácilmente git, mercurial, la subversión, archivos zip, paquetes, etc.

Sin embargo, algo así como lo siguiente debería funcionar:

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

Es decir, eliminar todos los archivos excepto la .git directorio y .gitignore, etc. Esto para manejar el caso de archivos eliminados en el proyecto de un tercero. A continuación, descomprima el archivo zip actualizado en el directorio. Agregue cualquier archivo nuevo al repositorio. Cometer.

Espero que ayude! :)

+0

Como tienen el mismo nombre en el archivo comprimido (incluso cuando cambian el contenido), creo que es peligroso descargarlo y esperar lo mejor. – Johan

+1

Ya veo. Aún así, no tiene que descargarlo de internet. Puede buscarlo desde un servidor interno que solo contiene versiones aprobadas y aprobadas. – lemonad

+1

¿Por qué no usar 'git clean' en lugar de usar' find' para eliminar la versión anterior? –

0

Mi preferencia es crear un repositorio de git, actualizarlo periódicamente (git commit -a -m 'Actualizar') y simplemente vincularlo en mis proyectos (como un directorio (ln -s, unión, etc.) o como una biblioteca compartida). Para archivos que no necesita, use .gitignore.

+0

Eso suena exactamente como su plan, pero está pidiendo ayuda con la forma de reemplazar los archivos antiguos por los nuevos, agregar y eliminar según sea necesario. También tenga en cuenta que algunos proyectos vienen con .gitignore. – ysth

Cuestiones relacionadas