git workflow: repositorys públicos y privados donde los contenidos de las carpetas divergen pero no se fusionarán

Estoy buscando una forma práctica de trabajar en un repository privado y público donde los contenidos del repository privado en una carpeta específica pueden diferir de los de la twig pública. Esta carpeta debe existir en ambas twigs y su contenido debe ser rastreado en ambos repositorys, pero nunca debe fusionarse.

Esta es la configuration simplificada del repository:

/folderA <-- public content /folderB <-- mixed public & private content /folderB/private.files <-- this file is different in public & private repos /folderB/newPrivateFolder <-- private repo may add more private-only folders here 

Estos son mis requisitos aparentemente simples, sin embargo, no he encontrado una buena solución de trabajo:

  • private.files debe existir en el repository público con contenido pnetworkingeterminado para que el proyecto funcione
  • los cambios en private.files en public repo no deberían fusionarse con repo privado
  • private.files cambios en private.files se deben rastrear en repository privado ya que los miembros del equipo lo necesitan
  • los cambios en private.files en el repository privado nunca deben fusionarse con el repository público
  • los files / carpetas adicionales añadidos a la folderB en el repository privado nunca deben agregarse al repository público
  • las recompras de reportes privados deben estar aisladas, la historia del repository privado no debe fusionarse con el repository público

El repository privado es un duplicado del repository público.

Lo que he intentado:

  • include el repository público como submodule o subtree
    • no puede "anular" el contenido de la carpeta privada porque los cambios van directamente al repository público al includelo como submodule o subtree
    • plus: un poco inútil para include el proyecto completo como subtree ya que quiero dos versiones divergentes del mismo repository
  • escaso-pago y envío
    • fusionar aún fusiona todos los files / carpetas, incluso aquellos que no están desprotegidos en la sucursal local
  • attributes fusionar filter
    • solo se aplica al fusionar contenido, pero aún permitirá agregar / eliminar files

Lo que aún no he probado:

  • dos repositorys completamente desconectados (no un duplicado), y de alguna manera fusionarlos mientras aseguran que los contenidos de la carpeta B estén "limpios"
  • Repo de fusión local donde se deshacen todos los cambios de la twig repo privada en una carpeta específica (¿cómo?) antes de fusionarse con la twig repo pública (bueno, en realidad lo he intentado y parecía funcionar con check-in disperso, pero una vez empujado todos los cambios privados fue directamente al repository público)

¿Algo más que pueda probar?

Tal vez ya haya una solución para este problema, pero he estado buscando docenas de SO y docenas de artículos más en la web, pero parece que no hay ninguna solución para este problema de contenido de carpeta divergente.

en situaciones similares (implementación en diferentes instalaciones con pequeñas modificaciones locales pero permanentes) he utilizado una twig maestra que no incluye nada o files ficticios en las carpetas en cuestión. luego, para cada configuration local (que sería privada y pública en su caso), creé un branch off master e hice los cambios relevantes allí.

el desarrollo se lleva a cabo en el maestro y ocasionalmente me cambio a las otras twigs (privadas / públicas) y me fusiono del maestro a estas twigs, nunca al revés.

las diferentes configuraciones (privadas / públicas) solo comparten el código del maestro, no las modificaciones locales, puedo savelas por un time indefinido, y todavía tengo un lugar central único para cambios / desarrollo (la twig principal).

Parece tan simple ahora que lo descubrí. Básicamente, elimine folderB en merge y reemplácelo con su contenido público, luego commit.

La configuration básica requiere:

  • repository público llenado con contenido inicial "pnetworkingeterminado" en la carpeta B
  • duplique el repository público en repo privado usando esta guía (aplique solo el primer cuadro de código)
  • Repo tanto público como privado conectados en un repository local como sucursales con sus respectivos orígenes: este repository local es donde suceden las fusiones
  • haz tu trabajo en la twig privada

Ahora cuando el repository privado ha realizado modificaciones y adiciones tanto a la carpeta A como a la carpeta B y desea fusionar todos los cambios excepto los de la carpeta B en el repository público, se fusiona de la siguiente manera (sugiero una twig de fusión adicional para experimentar con security):

  • fusionar una twig privada en una twig pública (o fusionar): no comprometer aún
  • ejecuta los siguientes commands en el repository (esto supone una twig de fusión):
    • git checkout merge-branch
    • git merge -s recursive -Xtheirs --no-edit --no-commit private-branch
    • rm -rf folderB
    • git reset <tree-ish> -- folderB/
    • git checkout --theirs <tree-ish> -- folderB/
  • ahora cometer como de costumbre

Que hace esto?

  • el checkout cambia a la twig de fusión (se recomienda usar uno, y debe estar actualizado con el origen)
  • merge acepta todos los cambios de la twig privada (fusiona "theirs"), ninguna edición evita que merge nos solicite información (commit message) y ninguna confirmación impide la confirmación porque queremos limpiar el directory de trabajo antes de comprometer
  • rm elimina toda la carpetaB y su contenido (incluidas las subcarpetas) del directory de trabajo. Esto evita que los files / carpetas añadidos se agreguen al índice de la sucursal en la confirmación porque, bueno, los eliminó.
  • reset usa un "tree-ish" (es decir, branch o en mi caso uso un commit SHA) para reiniciar el índice y el directory de trabajo de la carpetaB
  • checkout luego saca el estado actual de la carpeta B para restaurarlo a su estado HEAD tal como está en el repository público. Esto significa que todo el contenido de la carpeta B permanece sin cambios desde la perspectiva del repository público.

No estoy seguro si tanto el reinicio como el process de pago son necesarios, pero lo estoy haciendo de todos modos. Siéntete libre de experimentar

Como consecuencia, el historial de confirmación de cualquier cambio en la carpeta B en la twig privada no se agregará al repository público si se limpia el directory de trabajo después de la fusión y antes de confirmar.

Traté de experimentar con un gancho post-fusión para hacer el trabajo, pero parece que no se ejecuta si no se compromete. Además, es más fácil simplemente poner todos los commands en un script.

La fusión de los cambios en el repository público de vuelta al repository privado funciona normalmente, no se requieren pasos adicionales.