Usar files de configuration condicional con Git

Con frecuencia me encuentro cambiando una sola variable en mi proyecto dentro de Git para conectarme a un server diferente mientras estoy en la twig Desarrollo (en JavaScript, por lo que no puedo usar el preprocesador define).

¿Hay alguna forma en Git de poder usar condicionalmente un file u otro dependiendo de qué twig estoy?

No puedo simplemente confirmar ese cambio con la URL diferente especificada, ya que de hacerlo quedaría en mi historial de confirmaciones, y si vuelvo a esa versión más adelante en Master una vez fusionada, tendrá la URL del server de desarrollo.

No, no, pero este es un problema bien resuelto.

Tienes pocas opciones:

Versión de control de un file de configuration de ejemplo

  • No almacene datos específicos del entorno en el control de versiones
  • Cree un file config.example que enumere todas las opciones de configuration que necesitan ser especificadas, y proporciona los valores por defecto para el desarrollo.
  • Los usuarios que config.example su repository deben copyr config.example al nombre de file de configuration real y agregar valores reales
  • Agregue el nombre del file de configuration real a .gitignore .
  • Guarde sus cnetworkingenciales de producción fuera de git, pero una copy de security,
  • Como config.example adicional, puede agregar un script setup.sh , que copy config.example a la location de la configuration real y lo rellena con variables para el entorno local.

Como ejemplo, puede que tenga una aplicación de JavaScript que necesita saber dónde está su database, y lee esta información de config/database.json . Puede usar algo como esto:

 // config/database.example.json DATABASE = { "host": "localhost", "user": "#TODO", "pass": "#TODO", } 

Para ejecutar en desarrollo, copie este file a config/database.json y complete los valores apropiados para su entorno de desarrollo.

En producción, tendría una config/database.json que contenía valores de producción, pero no estaba controlada por la versión.

El repository tendría config/database.json en su .gitignore .

Archivos de configuration específicos del entorno de control de versiones

  • Almacene X diferentes files de configuration, uno por entorno, config.development config.production y config.production etc.
  • Haz un enlace simbólico con el correcto para tu entorno.
  • agregue el enlace simbólico a .gitignore

Si hay algo remotamente sensible en su file de configuration, como las keys AWS o cualquier forma de contraseña, debe usar la primera opción: almacenar el nombre de la opción de configuration, pero no su valor, y solicitar a los usuarios que proporcionen sus propias cnetworkingenciales obtenidas a través de canales seguros fuera del control de versión.

Tenga en count que la condición incluye la configuration viene, comenzando con Git 2.13 (Q2 2017).
La única condición admitida hasta ahora es el nombre del proyecto, no el nombre de host.

En su caso, eso funcionaría si cada twig estuviera desprotegida en su propia carpeta (con git worktree : vea " Varios directorys de trabajo con Git ").

Consulte commit 86f9515 , commit 4aad2f1 (05 abr 2017) por Nguyễn Thái Ngọc Duy ( pclouds ) .
(Fusionada por Junio ​​C Hamano – gitster – in commit a2e2c04 , 24 de abril de 2017)

config : agregar inclusión condicional

En ocasiones, un set de repositorys desea compartir configuraciones entre ellas que son distintas de otros sets de repositorys.
Un usuario puede trabajar en dos proyectos, cada uno de los cuales tiene varios repositorys, y usa un user.email para un proyecto mientras usa otro para el otro.

Configurar $GIT_DIR/.config funciona, pero si la penalidad de olvidarse de actualizar $GIT_DIR/.config es alta (especialmente cuando termina clonando a menudo), puede que no sea la mejor manera de hacerlo.
Tener las configuraciones en ~/.gitconfig , que funcionaría para un solo set de repositorys, no sería bueno en tal situación.
Tener ${HOME}s separados puede agregar más problemas de los que resuelve.

Extienda el mecanismo include.path que permite que un file de configuration incluya otro file de configuration, de modo que la inclusión solo se puede realizar cuando se cumplen algunas condiciones.
Entonces ~/.gitconfig puede decir "include config-project-A solo cuando se trabaja en el project-A " para cada project A el usuario trabaje.

En este parche, la única agrupación compatible se basa en $GIT_DIR (en ruta absoluta), por lo que necesitaría agrupar repositorys por directory, o algo así para aprovecharlo.

Ya tenemos include.path para include.path incondicionales.
Este parche va con includeIf.<condition>.path para includeIf.<condition>.path que se requiere una condición.
La nueva configuration tiene el mismo enfoque de compatibilidad hacia atrás que include.path : las versiones anteriores de git que no comprenden includeIf simplemente las ignorará.


Git 2.14 (Q3 2017) aclara la documentation.

Consulte commit ce933eb , commit a076df2 , commit 994cd6c , commit 9d71d94 (11 de mayo de 2017) por Jeff King ( peff ) .
(Fusionada por Junio ​​C Hamano – gitster – en commit ed98060 , 29 de mayo de 2017)

La documentation ahora se lee e incluye:

Incluye

Las secciones include e includeIf permiten include directivas de configuration de otra fuente. Estas secciones se comportan de forma idéntica entre sí, con la exception de que includeIf secciones se pueden ignorar si su condición no se evalúa como verdadera; vea "Incluye condicional" a continuación.

El mismo Git 2.14 refuerza esa característica.
Ver commit 0624c63 (16 de mayo de 2017) por Ævar Arnfjörð Bjarmason ( avar ) .
(Fusionado por Junio ​​C Hamano – gitster – in commit b784d0b , 30 de mayo de 2017)

El [includeIf "gitdir:$dir"] path=... " [includeIf "gitdir:$dir"] path=... ", recientemente introducido, también se ha enseñado a tener en count los enlaces simbólicos.

El directory " $dir " especificado en " gitdir:$dir " puede ser un enlace simbólico a una location real, no algo que $(getcwd) pueda devolver.
En tal caso, una ruta real de " $dir " se compara con la ruta real del repository actual para determinar si los contenidos de la ruta especificada deben includese.

Parece que podrías estar interesado en un gancho ; específicamente, mira el enlace posterior a la salida. Básicamente, escribiría un pequeño script que modifica un file después de finalizar la compra según el valor de $(git branch) . No mencionas exactamente lo que tendría que suceder, pero probablemente implicaría a sed.

Puede agregar el file relevante a un file .gitignore , o tal vez escribir un .gitignore precompromiso, para que su cambio no se propague accidentalmente al repository público.