La mejor práctica de Git para files de configuration, etc.

Todavía soy nuevo en todas las cosas y me preguntaba cuál es la mejor práctica en lo que respecta a los files de configuration. Mi server de desarrollo local necesita diferentes valores de configuration para mi vivo, así que ¿cómo puedo detenerlo empujando / tirando esos files?

Use enlaces simbólicos.

Tome un ejemplo donde tiene un file de configuration llamado "config.ini". En el directory de trabajo de tu git repo, harías lo siguiente:

  1. Cree una versión del file de configuration llamado "config-sample.ini". Este es el file en el que harás todo tu trabajo.

  2. Cree un enlace simbólico entre "config.ini" y "config-sample.ini".

    ln -s config-sample.ini config.ini 

    Esto permite que todo su código apunte a "config.ini" aunque realmente esté manteniendo "config-sample.ini".

  3. Actualice su .gitignore para evitar que se guarde el "config.ini". Es decir, agregue una línea "config.ini":

     echo "config.ini" >> .gitignore 
  4. (Opcional, pero altamente recomendado) Cree un file .gitattributes con la línea "config.ini export-ignore".

     echo "config.ini export-ignore" >> .gitattributes 
  5. Haga algo de encoding y deployment …

  6. Después de implementar su código en producción, copie el file "config-sample.ini" a "config.ini". Tendrá que hacer los ajustes necesarios para configurar la producción. Solo necesitará hacer esto la primera vez que implemente y cada vez que cambie la estructura de su file de configuration.

Algunos beneficios de esto:

  • La estructura de su file de configuration se mantiene en el repository.

  • Se pueden mantener los valores pnetworkingeterminados razonables para cualquier opción de configuration que sea la misma entre dev y producción.

  • Su "config-sample.ini" se actualizará cada vez que inserte una nueva versión en la producción. Esto hace que sea mucho más fácil detectar cualquier cambio que necesite realizar en su file "config.ini".

  • Nunca sobrescribirá la versión de producción de "config.ini". (El paso 4 opcional con el file .gitattributes agrega una garantía adicional de que nunca exportará su file "config.ini" incluso si lo agrega accidentalmente al repository).

(Esto funciona muy bien para Mac y Linux. Supongo que existe una solución correspondiente en Windows, pero alguien más tendrá que comentar al respecto).

Git ignorará los files que no agregue explícitamente, por lo que la comprobación de diferentes twigs simplemente los deja donde están en la estructura del directory a medida que los otros files cambian a su alnetworkingedor. Si agrega su file de configuration al file .gitignore en la raíz de su repository (puede que tenga que crearlo, más información aquí ), entonces todavía puede hacer todos los commands de files como

 git add . 

si quieres y no te preocupes por eso.

La mejor manera es crear un file llamado ".gitignore" e insert los files / carpetas que desea ignorar.

De esta forma puedes hacer que git agregue * todo el time

Varias opciones están disponibles:

1. Commita un file de configuration pnetworkingeterminado, pero permita un file de configuration local

Agregue un file default.conf a su repository de Git.

Su aplicación primero busca app.conf pero si eso no existe, usa default.conf .

Los usuarios que quieran la configuration no pnetworkingeterminada pueden copyr default.conf a app.conf y luego editarlo.

Los usuarios no deben comprometer app.conf en el repository, ya que diferentes usuarios pueden querer configuraciones diferentes en ese file. (Por lo tanto, debe poner app.conf en su .gitignore ).

Con un giro (recomendado)

Su aplicación siempre carga default.conf pero si app.conf está presente, copyrá las configuraciones de app.conf sobre las configuraciones de default.conf .

Este giro tiene un par de ventajas:

  • app.conf solo necesita mantener las diferencias de los valores pnetworkingeterminados, haciéndolo más pequeño y más fácil de mantener.

  • Cuando la aplicación cambia, los nuevos valores pnetworkingeterminados agregados a default.conf estarán disponibles para la aplicación, sin que el usuario tenga que copyrlos en app.conf .

Esta solución es bastante similar a la respuesta anterior de Alan W. Smith, con una pequeña diferencia: si la aplicación puede comenzar sin que esté presente el file app.conf , se ejecutará de forma app.conf . Sin embargo, agrega cierta complejidad al código de inicio de la aplicación.

La sugerencia fue una de las pocas hechas por Linus Torvalds en una list de correo de git o kernel, pero no he podido encontrarla hoy.

2. Usar variables de entorno y / o arguments de línea de command

Puede usar una variable de entorno para apuntar su aplicación a un file de configuration específico. Puede iniciar su aplicación de esta manera:

 CONFIG_FILE=test.conf ./start-app 

o alternativamente:

 ./start-app --config=test.conf 

Esto significa que puede tener múltiples files de configuration development.conf , staging.conf y production.conf . Cuando inicie la aplicación, dígale qué file de configuration usar.

Los desarrolladores que quieran experimentar con una configuration diferente pueden apuntar a su propio file, por ejemplo, custom.conf .

También puede usar variables de entorno o arguments de línea de command para anular configuraciones específicas:

 ./start-app --config=default.conf --db-url=... --debug-level=5 

3. Diferentes twigs

Puede mantener su configuration pnetworkingeterminada en su twig principal.

Tenedor de diferentes twigs para cada uno de sus diferentes ambientes.

Cada twig puede modificar el file de configuration pnetworkingeterminado según sea necesario.

Cuando las actualizaciones de su twig principal, se fusionan desde el maestro en sus twigs específicas.

Personalmente, no recomiendo este enfoque. Creo que es más difícil de mantener.