Detener Git de empujar files secretos (pero seguidos)

Usando git un file secreto top-secret.txt llamado top-secret.txt . ¿Cómo puedo asegurarme de que este file nunca se salga de mi sistema local cuando se presiona hacia un control remoto (pero se mantiene bajo control de versión localmente)?

Ejemplo

  • Digamos que tengo un commit que cambia el file secreto llamado top-secret.txt y otro file llamado not-secret.txt .
  • Al presionar este command, solo se transferirá al control remoto el cambio realizado en not-secret.txt .
  • El cambio realizado en top-secret.txt permanecerá en mi sistema local.

Información adicional: el empuje es realizado por un sistema de continuous integration, así que tengo la oportunidad de ejecutar scripts localmente antes de presionar al control remoto.

¿Debo configurar un submodule de Git para esto o hay una solución más simple?

No puedes. El model de objects subyacente de Git (que todo es un object de uno de cuatro types: commit, tree, anotated-tag o "blob" -ie, file) prohíbe distinguir entre "file que puedo ver pero no puedes" y "file" todos pueden ver ". Cualquier persona con una copy del repository puede ver todos los objects en el repository.

Por lo tanto, solo hay dos forms de mantener un file secreto:

  • no includelo en el repository en primer lugar, o
  • encriptarlo

El método del submodule equivale a hacer el primero de estos, al time que da una pista de que falta algo (no es lo mismo que "allí, pero está encriptado").

Crearía una subcarpeta para contener su file secreto y crearía un repository de git local en ese directory, es decir, git init mysecretsubdir . A continuación, agregue mysecretsubdir/ a su .gitignore , para que nunca se comprometa con el repository principal. Esto le permite mantener un historial de versiones como su file secreto, sin compartirlo con otros.

De acuerdo, este enfoque es un poco hacky, pero git no está hecho para hacer lo que estás pidiendo. Otra cosa que podría hacer es crear un filter que cifra automáticamente su file cuando entra en el índice y descifrarlo cuando entra en su directory de trabajo.