git mirroring a GitHub y filtrado de files privados

Actualmente trabajando en un proyecto. Queremos abrir nuestras comstackciones día a día con información completa (autor, etc.) al filtrar algunas carpetas privadas específicas.

Digamos que confirmo A / file1 y B / file2 en Branch Master, me gustaría tenerlo reflejado en GitHub con la carpeta B filtrada (esta confirmación solo tendría A / file1).

Una forma en que pensaba hacer esto es un gancho de actualización remota que:

  • Enumerar todos los nuevos commits agregados por newref (digamos lastfoundcommit..newref)
  • Enmiende esos commits uno por uno (de lastfoundcommit a newref) para eliminar los files no deseados
  • En el process, podría crear una twig filtrada maestra local (si ayuda a tenerla localmente)
  • Empuje esta twig al repository público
  • De alguna manera, mantenga un mapeo de la identificación de compromiso entre las confirmaciones públicas y privadas, para calcular fácilmente el "último error" en la próxima inserción.

Idealmente, podría funcionar en ambos sentidos (es decir, sería bueno si también pudiéramos importar github de nuevo twigs y requestes de extracción y tenerlas "rebasadas" en la parte superior de nuestro repository privado, ya sea automáticamente o con un process simple, probablemente no tan difícil ya que es probable que solo sea una rebase).

Esto es algo similar a lo que puede hacer el subtree de git, excepto que no es extraer un subdirector sino filtrar varios files.

¿Eso parece factible? O cualquier otra sugerencia? (tal vez basado en git filter-branch? o cualquier otra herramienta / script existente que pueda ayudarme?)

Nota: el submodule no es una opción viable, ya que podría ser escaso y se estorbaría demasiado. Además, la list de files "privados" puede extenderse / cambiar con el time.

Su plan está bien, excepto que debe usar git filter-branch para reescribir las confirmaciones. El command filter-branch está diseñado para propósitos como estos y le da la máxima potencia para reescribir commits de la manera que desee.

Sería muy fácil tener las secuencias de commands que proporcione a filter-branch registrar la asignación de asignación de antigua a nueva.

Dicho esto, aunque diga que los submodules no son una opción viable, en mi opinión usar una carpeta "privada" en el nivel superior, que en realidad es un repository git hospedado por separado, es una mejor idea que la reescritura del historial que está proponiendo. Es less propenso a errores, más fácil de implementar y más fácil de entender.

He estado en una situación similar:

No use la twig de filter git

Use el limpiador de reposition BFG en su lugar. Es MUCHO más rápido y fácil de usar.

Necesita podar todas las confirmaciones en su repos con regularidad, para no mencionar sus carpetas / files privados.

Divide repositorys

Tener repos completo y OSS uno. Deje que sus scripts transfieran files de uno a otro y realice testings especiales en OSS para que NO PUEDA encontrar allí lo que NO se debe.

Ambos repositorys deben estar dentro de su networking, preferiblemente en la misma máquina (security). Solo la twig permitida, revisada y limpia del repository OSS sale de la máquina (presione hacia GitHub o donde sea).

Use submodules

Haga un POC con submodules / subtreees para ver si no funcionarán mejor que los scripts. Perderás 2 horas adicionales y estarás seguro. Creo que podrían ser opciones viables ya que ustedes tienen carpetas privadas …

Utilice project ignore y .git / info / exclude

Puede usar .git/info/exclude para excluir files y carpetas privadas en el repository de OSS, de esa manera, incluso la información sobre ellos evitada a propósito por la atención de Git no se pierde.

En su repository habitual puede agregar esos files a .gitignore, en una twig, que sirve como filter inicial y luego se utiliza para alimentar el repository de OSS.