Git: configuration de la aplicación y diferentes entornos

Usamos git para la mayoría de las aplicaciones web que creamos en nuestra tienda, y aunque las aplicaciones usan una variedad de tecnologías (PHP, Rails, etc.), generalmente tenemos un server de producción y producción para cada sitio. Normalmente, estos serveres tienen diferentes sets de cnetworkingenciales de database, así como diferentes configuraciones de configuration basadas en el entorno (por ejemplo, almacenamiento en caching). Nuestro flujo de trabajo generalmente implica el mantenimiento de dos twigs de git por proyecto: maestro, que refleja el server de producción, y organización, que refleja la puesta en escena. Las nuevas características se desarrollan en etapas (o una sub-bifurcación) y se fusionan de nuevo a maestro una vez finalizado e implementado.

Mi pregunta es con respecto a la mejor manera de mantener los files de configuration que son específicos de twig y entorno. He visto las respuestas de preguntas similares aquí y aquí , y ninguna de las dos me satisface. Los dos enfoques principales parecen ser: a) usar la exclusión de .gitignore para dejar los files de configuration fuera del ámbito de git, ob) escribir un código reflexivo y respetuoso con el entorno que determine, por ejemplo, qué cnetworkingenciales de database usar en base al nombre de host. Mi problema con a) es que solo permite que exista un set de files de configuration en la base de código (independientemente de la twig actual), por lo que los files de configuration del otro entorno se pierden. b), por otro lado, simplemente parece requerir una modificación innecesaria de la base de código de una manera que no se siente relacionada con la funcionalidad de la aplicación.

Idealmente, me gustaría una forma de "bloquear" los files de configuration dentro de una determinada twig, de modo que cada vez que obtengo el master, obtengo los files de configuration maestra, y cada vez que pago por etapas, obtengo los files de configuration de preparación. Además, fusionar la transición al maestro no debería afectar los files de configuration maestra de ninguna manera. Hasta la date, hemos solucionado esto al tener carpetas que contienen files de configuration específicos del entorno fuera de la raíz de git y mover manualmente los files apropiados a la base de código durante la implementación, pero esto es, por supuesto, innecesariamente peligroso (y potencialmente peligroso).

¿Hay alguna forma de lograr esto usando git?

¡Gracias por tu consideración!

No estoy seguro de por qué las personas piensan que pueden escapingse sin algún tipo de herramienta de installation. Git se trata de hacer un seguimiento de la fuente, no de implementarla. Aún debe tener una herramienta de tipo "make install" para pasar de su repository de git a la implementación real, y esta herramienta puede hacer varias cosas, como la expansión de templates o la selección de files alternativos.

Por ejemplo, puede tener "config.staging" y "config.production" registrados en git, y cuando implemente en etapas, la herramienta de installation selecciona "config.staging" para copyr a "config". O puede que tenga un solo file "config.template", que tendrá la function de hacer "config" en la implementación.

Puede intentar usar los ganchos post-merge o post-checkout para verificar que todo esté como debería y, de lo contrario, corríjalo. Esto realmente parece ser sugerido por el libro ProGit ( http://progit.org/book/ch7-3.html aproximadamente el 70% de la página, en la sección "Otros enganches de cliente").

El concepto es básicamente escribir esos ganchos para que actúen como minirreglos "make install" que garanticen la configuration correcta por bifurcación, por host, por la presencia o el contenido de otros files, por lo que sea que desee. Los ganchos podrían incluso reescribir sus files de configuration o recrearlos completando templates.

Supongo que, por lo general, el master solo tiene confirmaciones que ya están en staging . Si agrega un compromiso extra al master que contiene las diferencias en la configuration entre las dos twigs, entonces al volver a basar este compromiso sobre lo que se saca de la staging en staging debe mantener la configuration. Esto no es tan simple como "fusionar la puesta en escena en el maestro no debería afectar a los files de configuration maestra de ninguna manera", pero como tendrías un conflicto de combinación en estos casos, puede ser lo suficientemente cerca.