2011-06-03 27 views
16

Hay un montón de archivos en mi proyecto que a veces se modifican pero siempre se comparten entre muchas ramas diferentes. Los ejemplos incluyen scripts de compilación, archivos por lotes que incluyen rutas de acceso, etc. Incluso el archivo .gitignore es un ejemplo.Compartiendo archivos entre sucursales en Git

Quiero este material en control de fuente, pero no quiero que las ramas individuales realicen un seguimiento de los cambios en ellos.

¿Cómo manejas esta situación?

¿Realizas un seguimiento de todo lo relacionado con tu proyecto en Git? ¿Cuál es su enfoque para los objetos compartidos?

¿Es mi primer aviso mi única opción?

Respuesta

2

Mantenga sus scripts de compilación y archivos por lotes en un repositorio por separado?

+3

Esto se estrecha (el mantenimiento de ellos en un repositorio remoto), pero creo que un submódulo va a ser una mejor opción. –

+2

@Jon un submódulo * es * solo un informe separado ... – meagar

+3

@meagar es cierto, pero "un repositorio separado" no implica un submódulo. –

0

Para sistemas simples, crearé versiones base de estos archivos que están en control de versiones que luego se adaptan para cada instancia, cuyos archivos están en .gitignore.

Si uso una cadena de herramientas más sofisticada, crearé archivos XML de origen que describan las piezas base, archivos XML que describan las variaciones de instancia específicas y luego ejecutaremos un XSLT usando un perfil o propiedad de línea de comando para generar el Versiones localmente apropiadas como parte de la configuración/script de construcción dependiendo de su veneno. Esto no tiene que ser XML/XSL, simplemente trato mucho en XML, puede usar cualquier tipo de sistema de munging que funcione con su entorno de compilación, digamos archivos de texto con scripts Perl o simplemente sed/awk.

0

Puede lograr el mismo efecto que los archivos .gitignore configurando el bit skip-worktree de los archivos rastreados.

git update-index --skip-worktree <path_to_file> 

Git ahora simulará que sus archivos están actualizados.

2

Las otras respuestas no abordaron mi problema tan limpiamente como me gustaría, pero sí me empujaron a buscar más opciones.

En primer lugar, git no tiene el concepto de rastrear archivos individuales, solo repositorios y ramas completos.

No hay una forma incorporada de elegir un conjunto de archivos que se deben mantener en control de fuente y administrados independientemente de otras ramas individuales.

En mi proyecto, prácticamente todos los archivos compartidos se encuentran en un subdirectorio en particular. Mientras que el resto del árbol fuente puede cambiar y debe ser administrado por ramas individuales, este conjunto de archivos "de configuración" se puede compartir entre varias ramas para mantener el repositorio en estado "activo".

No he podido encontrar la solución porque no he leído libros en git y no conozco el término de búsqueda correcto. La solución de Git para esta situación es submodule.

Si, en cambio, mi información de configuración se extendió entre archivos individuales que no están contenidos en un directorio individual, un submódulo no sería adecuado.

En ese caso, un remote git repository should be set up and the files would be maintained in the separate repository using git-push.

4

En lugar de confiar en los submódulos, ¿ha considerado git-subtree?

Como se indica en la documentation:

subárboles no deben ser confundidos con submódulos, que están destinados para la misma tarea .

A diferencia de submódulos, subárboles no necesitan ningún construcciones especiales (como archivos .gitmodule o gitlinks) estar presentes en su repositorio, y no fuerza usuarios finales de su repositorio a hacer nada especial o para entender cómo funcionan los subárboles.

Un subárbol es sólo un subdirectorio que se puede cometer a, ramificado, y se fusionó junto con su proyecto en cualquier forma que desee.

A continuación se presentan algunos de los puestos que dan algunos comentarios y explicar las ventajas de subárboles sobre submódulos:

Un hilo muy interesante (y algo climatizada), a partir de la lista de correo de git, discutiendo pros y los contras de git-subárbol y submódulo

+0

Es un (gran) inconveniente que el subárbol no está integrado en git, pero el subárbol parece que es MUCHO más fácil y menos propenso a dolores de cabeza que los submódulos. Casi estoy pensando que un repositorio remoto (ignorado por el repositorio principal con .gitignore) negará los problemas de los submódulos, tendrá un poco más de sobrecarga que los subárboles (pero evitará el problema de mantener las instalaciones de los subárboles) y será a prueba de futuro para versiones posteriores de git que pueden hacer obsoleto el subárbol. –

+0

@Jonathon: He agregado un enlace a un hilo en la lista de git que habla sobre las dos características desde una perspectiva técnica central. – nulltoken

+0

la discusión fue interesante, pero para alguien que no está íntimamente familiarizado con git y sus aspectos internos, es imposible para mí saber cuál es "mejor". Usted tiene el autor de los subárboles que argumentan con fuerza por qué se rompen los submódulos, y Linus Torvalds (autor original de git) comenta que el almacenamiento basado en árbol (como el subárbol) está inherentemente roto. Cuanto más leo, más parece que ninguna opción vale la pena y debería usar un repositorio remoto. –

Cuestiones relacionadas