2010-09-10 6 views
8

Tengo un repositorio para una aplicación en la que estoy trabajando que incluye un archivo de configuración. Actualmente, distribuyo con una extensión .dist y le pido al usuario que cambie el nombre del archivo antes de editarlo.Agregue el archivo de configuración ignorado a git repo como muestra

nate:~/myAwesomeApp% git ls-files 
.gitignore 
README 
config.dist 
glorious_support_lib.p 
bestProgramEvar.f90 

Esto está bien y excelente, y la configuración real se ignora.

nate:~/myAwesomeApp% cat .gitignore 
config 

Sería dulce, sin embargo, si tan sólo pudiera distribuir ese archivo de configuración bajo su nombre real y listo para editar, dejando al mismo tiempo ignorado de modo que una copia recién clonado del repositorio tiene una distribución "funcional", y no es sobreescrito, clobbered, o de otra manera abusado, y de forma que los usuarios no tienen que preocuparse de empujar o publicar sus super-secretas detalles de configuración a través de la interwebs involuntario git commit -a -m 'hurrrr derp! oopsies!' && git push

¿Hay alguna forma de hacer esto? De tener git mantener alrededor de una sola versión original del archivo que se clona, ​​pero es a partir de entonces ignorado?

Estoy seguro de que esto se ha preguntado antes, pero durante mi vida, mi google-fu ha fallado. Coloque la escuela en lo profundo, SO.

Respuesta

2

Puede también la versión y distribuir:

  • .gitattributes unos archivos declarar una filter driver (sólo para 'config.dist')
  • un guión mancha que detectará que el contenido y generar el archivo final (y privado, como en "no versionado" config)

Ahora que yo s doblar un poco lo que es un controlador de filtro (se trata de modificar el contenido de un archivo, regardless of its "state", i.e its full path and name). Pero puede funcionar
El .gitattributes contendría:

config.dist filter=generateConfig 

alt text

y se puede registrar su guión mancha (aplicada durante el paso de pago al crear/actualizar el directorio de trabajo) como:

git config --global filter.generateConfig.smudge /path/to/generateConfig 
6

Probablemente incluiría un script de 'instalación' de algún tipo que copia 'config.dist' a 'config'.

No creo que haya una manera de tener un archivo no ignorado ni ignorado.

+0

Eso es básicamente lo que estoy haciendo ahora Sería dulce si hubiera una habilidad de "ignorar después de cometer xxxxxx". – sleepynate

+0

@sleepynate ¿Quizás un enlace de confirmación de entrada verifique la confirmación xxxxxx y agregue algo a .gitignore? – takeshin

4

Esta es una buena pregunta, pero AFAIK no hay una solución Git para esto.

algunas soluciones:

  • configurar su aplicación para leer config.dist cuando config no está presente (por ejemplo PHPUnit utiliza esta técnica)
  • utilización escritura de la estructura que hacer cambiar el nombre para usted (por ejemplo, hormiga o phing)
  • use git hooks para cambiar el nombre a las configuraciones
+0

Creo que 'post-checkout' se ejecuta en el clon ... pero, ¿el gancho se cae con el repositorio en el clon inicial? ¿Cómo se ve eso? – sleepynate

+0

@sleepynate Esto será difícil de hacer. Solo probado: los ganchos no se clonan con el repositorio en 'git clone [repo]'. Pensé en los ganchos git utilizados durante el desarrollo. No consideré la clonación como una técnica de distribución de la aplicación. – takeshin

+0

Oh, lo siento. Voy a editar para mayor claridad. Esto es para el usuario final cuando se clonan. ya tengo un 'si [! -e config]; luego cp config.dist config; fi' – sleepynate

1

Como han señalado otros, no existe una solución mágica para esto en Git. Y hasta donde yo sé, es lo mismo con otros sistemas de control de versiones.

Los enganches tampoco son una solución aquí, si funcionaran de esta manera, sería una grave amenaza para la seguridad: con sólo clonar un repositorio, podría ejecutarse un código malicioso en su máquina.

Pero para usar su aplicación, el usuario tiene que hacer al menos una cosa más además de clonarlo con git: ejecutar su aplicación.

  • no Si se está modificando el archivo de configuración se requiere para ejecutar la aplicación, a continuación, si el programa hace if [ ! -e config ] ; then cp config.dist config ; fi en el arranque, a continuación, en mi humilde opinión que debería ser más que suficiente. Además, debe tener una advertencia dentro de config.dist que dice que no debe modificar este archivo, sino que debe hacer una copia en su lugar.

  • Si la modificación del archivo de configuración es necesario, a continuación, iniciar el programa sin archivo de configuración podría poner en marcha algún modo de instalación, que pide al usuario que introduzca las opciones de configuración necesarias y las guarda.

  • Una tercera posibilidad es que su aplicación es incapaz de para modificar el archivo de configuración cuando se inicia (tal vez solo se trate de algunos archivos JavaScript + HTML). En ese caso, no veo otra opción que tener un script de compilación separado o dejar que el usuario lo haga manualmente.