¿Cómo empujar y tirar desde github sin compartir información confidencial? Mancha y limpia?

Cuando retiro de github a un repository de server, quiero evitar sobreescribir información sensible localizada en ciertos files, por ejemplo config.php.

Nota: no es un repository de fuente abierta; Tengo control total sobre el repository, soy el único usuario, es privado, pero críticamente, se basa en un marco de código abierto que podría cambiar la estructura de los files de configuration . Solo quiero poder extraer de ella para probar, organizar y producir y no accidentalmente tener la configuration de producción terminada en la testing, etc. Pero no puedo volver a codificar los files de configuration para extraer datos de otro lugar sin hacer situaciones difíciles de fusión más adelante si el marco se actualiza.

Idealmente, me gustaría poder decirle a Git, al tirar, durante la obtención de REPO_URI, descartar cualquier trozo que pueda cambiar la información que se encuentra en la línea 24 de FILE_PATH. Sin embargo, creo que eso no es posible (corríjanme si me equivoco).

Sin embargo, a less que alguien pueda ofrecer una forma de hacer lo anterior, lea la siguiente solución y avísenme si esa es la forma ideal de hacerlo:

Usaría la expansión de palabras key como se describe en la guía del usuario de git aquí . A continuación describiré cómo haría esto y luego, en la parte inferior, haré algunas preguntas sobre este enfoque.

Descripción del método

Primero escribo dos scripts, "sensitive_values_inserter" y "sensitive_values_remover", que intercambian ciertas palabras key ficticias (que estarán en el maestro repo de github) con la información confidencial en particular, como passwords, nombres de usuario, routes de bases de datos, etc.

#! /bin/sh -f sed -e 's/@[email protected]/dummyvalue/' -e 's/@[email protected]/dummyvalue/' $1 

etc.

En segundo lugar, haría tres versiones de este script, una para cada entorno: testing / assembly / producción. Cada versión contendría las passwords específicas, nombres de usuario y routes de bases de datos relevantes para el entorno al que pertenece, en lugar de los valores ficticios. Colocaría cada una de estas secuencias de commands en una ruta relativa a cada uno de estos repositorys de código, como esta:

 /live/filters/sensitive_values_inserter /live/filters/sensitive_values_remover /live/repo/{LIVE} /test/filters/sensitive_values_inserter /test/filters/sensitive_values_remover /test/repo/{TEST} /stag/filters/sensitive_values_inserter /stag/filters/sensitive_values_remover /stag/repo/{STAG} 

Cada uno de estos filters tendría los valores específicos para las configuraciones relevantes.

Entonces toda la configuration del repository se modificará como tal:

 $ git config filter.infosafe.smudge '../filters/sensitive_values_inserter' $ git config filter.infosafe.clean '../filters/sensitive_values_remover' 

Finalmente en el repository del server haz esto:

 $ echo 'config.php filter=infosafe' >> .gitattributes 

De esa manera, siempre que lo saque del server principal, si entiendo esto correctamente, estos filters replaceán los valores "ficticios" con los que quiero usar.

Nota: para que esto funcione, como se señaló en esta otra pregunta de stackoverflow , después de configurar todo como se mencionó anteriormente, debe:

 cd /path/to/your/repo git stash save git checkout HEAD -- "$(git rev-parse --show-toplevel)" git stash pop 

Entre el pago y el alijo, tuve que enviar todos los cambios a los files donde se había realizado la operación de limpieza. No te preocupes, después de que los cometes, los que están en el directory de trabajo se manchan. (Es un poco contra-intuitivo, pero funciona).

Pude presionar con éxito a github y solo aparecen los valores limpios.

(Hay una técnica alternativa más avanzada en esta línea que implica el uso de un .gitignore por twig, y ​​dos controlleres y dos filters por twig. Esto permite que las passwords activas se eliminen cuando se cambia a la twig de testing, y viceversa. El truco es invocar a los limpiadores para ambas twigs en el .gitignore de cada twig, pero solo invocar la mancha de la twig que es el hogar del .gitignore, por lo que restaura la contraseña de sí mismo. Todavía en este escenario, al presionar para github toda la información confidencial permanece limpia, lo cual es bueno. Podría entrar en detalles sobre eso si alguien está interesado).

Preguntas sobre este método y alternativas

Probé esto, y funciona. Pero…

¿Hay una mejor manera de hacer esto usando git ? Podría agregar que no es una opción simplemente ignorar los files que tienen la información confidencial en ellos y no es una opción ignorar los cambios en ellos al fusionarlos, porque quiero poder realizar cambios en estos files conservando ciertos valores de configuration. . Es por eso que no quiero simplemente usar git update-index --assume-unchanged FILENAME para ignorar permanentemente futuras modificaciones locales a los files completos.

Gracias.