2010-02-03 11 views
10

Tengo un proyecto de código cerrado que se basa en mi marco de código abierto. Quiero saber cómo debería estructurar mi flujo de trabajo. Debajo está mi mejor conjetura que usa el git con los submódulos.Flujo de trabajo de Git adecuado para sistemas operativos combinados y códigos privados?

  1. puedo crear un acuerdo de recompra marco pública sobre github de cartuchos que son repositorios Git separadas.
  2. Compro una cuenta "micro" en github ($ 7) por lo que I puede tener un repositorio privado.
  3. Creo un repositorio privado y clono el repositorio de marco público.

Desde aquí puedo realizar cambios en:

  1. Mi código privado y empujar a mi repo privada en github
  2. El código de la arquitectura pública y empujar a mi repo GitHub privado y luego enviar un tirón solicitud del marco público ..? ¿O cómo funcionaría esto?

¿Cómo manejo un repositorio que contiene códigos y submódulos privados y públicos? En este momento, parece que solo tengo que mantener dos bases de código separadas para lograr esto.

Estoy buscando la mejor respuesta que pueda ayudar a alguien bastante nuevo a git a agilizar el proceso de trabajo en una base de código que es mitad de fuente abierta y mitad privada. Una cosa buena de esto es que cada carpeta es privada o pública, por lo que no hay que preocuparse por tener archivos privados y públicos en alguna parte, ¡aunque algunas de las carpetas privadas pueden estar en archivos públicos!

Otro ejemplo que podría dar sería el uso de zendframework para construir su sitio privado de la compañía sin dejar de hacer extracciones todos los días (y tal vez parches) al cepo repo. Y también tira y empuja de su sitio privado dentro del zendframework.

Por ejemplo, imaginemos una estructura de directorios como esto:

/private_folder 
/public 
     /public_folder 
     /public_folder2 
     /private_folder 

Quizás lo que te pido dos difícil de controlar a todos en un repo se unieron. Tal vez no haya una manera fácil de hacer esto y debería separarlos y hacer todos los parches públicos en uno y luego simplemente ingresar a mi repositorio privado. Por supuesto, esto significa que si estoy en el medio de trabajar en algún código privado, tendré que dejar ese repositorio y abrir el público y hacer que cambie el código parcheado, luego volver al privado, fusionar , y luego continúe trabajando en el código privado.

+0

Usted menciona Zend arriba. ¿Esto significa que su proyecto está basado en PHP? ¿O es solo un ejemplo? (Pregunto porque diferentes idiomas empaquetan el código de diferentes maneras y esto puede afectar su flujo de trabajo). –

+0

Sí, está basado en PHP, por lo que no es necesario * generar *. – Xeoncross

Respuesta

5

Recomiendo no utilizar submódulos de git, sino 2 repositorios diferentes que no están conectados en github.

Puede construir la relación entre ellos utilizando enlaces simbólicos en las copias desprotegidas, que es básico y simple. Los enlaces simbólicos solo deben crearse una vez por ubicación (producción, desarrollo, compañeros de trabajo).

La ventaja es que nadie tiene que hacer un esfuerzo extra para aprender y mantener los submódulos de git, y se evita el riesgo y la complejidad que conlleva.

Podría hacerse manteniendo una copia de trabajo del sistema operativo y del repositorio git privada en algún lugar en el equipo local:

/repos/myproject-os 
/repos/myproject-priv 

entonces se podría crear crear la estructura de directorios donde el proyecto en realidad va a vivir y ser trabajado en algún otro lugar en esta máquina (no dentro de la/repositorio/árbol) y crear symblinks de los subdirectorios que utiliza:

ln -s /repos/myproject-os/dir1 /wrk/myproject/base/dir1 
ln -s /repos/myproject-os/dir2 /wrk/myproject/base/dir2 
ln -s /repos/myproject-priv/dir1 /wrk/myproject/base/dir3 
ln -s /repos/myproject-priv/dir2 /wrk/myproject/base/someother/dir4 
mkdir /wrk/myproject/base/config 
mkdir /wrk/myproject/base/tmp 

de esa manera usted tiene la estructura del repositorio siempre limpio y se puede mezclar y organizar los directorios de ambos repositos ories de la forma en que los desea, y también tiene un espacio para configuraciones locales o archivos temporales que no entran en los repositorios.

Usted haría las confirmaciones de git y todo desde/repos/tree y su proyecto se ejecutaría y usted editaría los archivos desde/wrk/tree. Tenga en cuenta que el directorio .git donde viven los datos de git sería no estará disponible desde/wrk/tree, porque solo enlaza a subdirectorios (o posiblemente solo archivos del directorio raíz).

Parte2: Dice que quiere asegurarse de no presionar accidentalmente el código privado en el repositorio público. Se podría establecer un repositorio git adicional entre su repositorio OS trabajo y del repositorio GitHub, digamos que pones en/repositorio/portero, a continuación, el árbol se ve así:

/repos/gatekeeper/myproject-os 
/repos/myproject-os 
/repos/myproject-priv 

Cada vez que se pulsa desde/repositorio/myproject-os va a/repos/gatekeeper/myproject-os. Pero desde/repos/myproject-priv, ingresa directamente a su repositorio privado de github.

De esta manera usted tiene el mismo flujo de trabajo en ambos/repos/myproject-os y/repos/myproject-priv y no necesita preocuparse demasiado. De vez en cuando, cuando desee insertar sus cambios en la base de código del sistema operativo real, vaya a/repos/gatekeeper/myproject-os y presione desde allí hacia github.

Podrías hacer una revisión de código adicional antes de eso y mirar los diffs para estar seguro de que solo eso que realmente quieres se hace público.

Si desea seguridad adicional,/repos/gatekeeper/myproject-os también podría estar en una máquina diferente o incluso en una ubicación diferente.

+0

Buena idea. Supongo que para muchas carpetas (tengo cientos) podría crear un script de shell que crearía todas las carpetas para usted en cada máquina teniendo en cuenta una simple variable 'repo_path'. – Xeoncross

+0

Voy a premiarte con la recompensa porque lo que dices funcionará, pero no creo que realmente lo haga. Mucho difícil de configurar para varias personas en un equipo y con proyectos múltiples como este. – Xeoncross

+0

Interesante respuesta. Estoy en Linux, pero la mayoría de los desarrolladores de mi empresa están en Windows, por lo que no tienen el lujo de ln-s. ¿Alguien ha intentado esto en Windows? –

1

Puede tener una rama 'pública' y 'privada' en su repositorio local. Cuando presionas, cada rama es empujada a un repositorio remoto separado (busca la sintaxis 'git push'). Entonces, puedes fusionar libremente de público a privado.

Estoy seguro de que también hay una forma de combinar los cambios seleccionados de privado a público, aunque tendré que buscarlos.

+0

Con este flujo de trabajo no puede tener un directorio de trabajo con archivos públicos y privados. Cuando ha revisado la sucursal pública, solo ve los archivos públicos; revisa la sucursal privada y solo tienes los archivos privados. –

+0

@AmedeeVanGasse: Eso es incorrecto. La sucursal privada tiene archivos públicos y privados. La rama pública solo tiene archivos públicos. Eso es lo que hace "fusionar". –

+0

¡Eso no fue obvio por la explicación! –

-1

Haga que el repositorio público sea un submódulo dentro del privado. Al empujar, recuerda que debes empujarlos a los dos. También recuerde verificar el submódulo en el repositorio privado, de modo que rastrea qué revisiones del submódulo está utilizando.

1

git submodules le permite definir una configuración (consulte this question), que es una referencia a una confirmación de otro componente (en otro repositorio).

Puede desarrollar ambos códigos (su y los submódulos) dentro del mismo repositorio, pero cuando está hablando de múltiples directorios privados dentro de su código público, eso requiere un subtree merge strategy.
Le permitirá considerar sus directorios (privados y públicos) como un árbol de trabajo natural.

Y para gestionar mejor el empujar y tirar de partes de su repositorio global a uno privado, recomendaría el git subtree script tool.

1

En resumen, recomiendo este flujo de trabajo:

  1. que sea sencillo; tener una copia de trabajo para cada repositorio (no usar submódulos git)
  2. utilizar las herramientas de su lenguaje para empaquetar el marco
  3. scripts de instalación o herramientas de luz para hacer el cambio de contexto rápido o automático

I' he usado submódulos git en el pasado. No creo que sean adecuados para tu caso de uso. Las grandes desventajas que me saltan son:

  • Ayuda a comer tu propia comida para perros cuando construyes (o extraes) un armazón. ¿Esperas que los usuarios de tu framework también configuren los submódulos de git cuando usan tu framework? Supongo que no.
  • Existe el riesgo de publicar accidentalmente su código fuente privado en su marco de código abierto.
  • Los submódulos de Git han mejorado bastante en el último año, pero aún son relativamente menos conocidos. Incluso los gitters competentes pueden tener problemas con los submódulos.

Aquí hay una pregunta secundaria que admitiré que no es tan clara: "¿Qué flujo de trabajo hace que sea más fácil rebotar entre el marco OSS y el proyecto privado?"

  • Hay un cierto atractivo al usar submódulos y tener ambos proyectos en un árbol. Esto lo acelerará quizás en la edición de su texto, pero probablemente lo desacelerará (o causará más errores de lo habitual) cuando se trata de cometer y empujar.

  • Hay un cierto encanto de tener los proyectos separados. El cambio de contexto (de una ventana del editor de texto a otro) puede ayudar a recordarle que el proyecto OSS es para el consumo público. Por ejemplo, puede ayudarlo a no romper la compatibilidad con versiones anteriores y mantener un buen registro de cambios. Comprometerse y empujar será fácil en relación con la alternativa del submódulo.

Una vez que haya decidido sus copias de trabajo, querrá descubrir su flujo de trabajo diario. Dependerá de tu idioma, por supuesto. (En Ruby, por ejemplo, puedes empaquetar tu marco OSS como una gema, compilarlo y que tu código privado dependa de él). Lo que sea que elijas, configura algunos scripts (o atajos de editor quizás) para ayudarte a construir tus bibliotecas (o paquetes) rápidamente, tal vez incluso automáticamente cuando los archivos cambian, para que pueda rebotar entre su estructura y su proyecto sin esfuerzo.

+0

He estado leyendo mucho en el libro de progit.com últimamente y creo que tienes razón, sería mejor mantener todo separado si por una simple razón pudiera accidentalmente introducir código privado en el repositorio público. La otra razón es que tendré que adoptar este método de todos modos para proyectos adicionales que dependen del marco ya que no voy a seguir agregando más y más sitios a un repositorio combinado. – Xeoncross

0

Hay dos enfoque aquí:

  1. usted podría utilizar la rama de la misma repositorio git. En su repositorio privado, cree una sucursal con una referencia a su repositorio público y maneje ambas cosas así.

  2. Si los componentes que se utilizan en su proyecto privado son subproyectos de sus cosas públicas, entonces debe usar submódulos. El manejo del submódulo está en una especie de etapa inicial en git en la versión 1.6.6, pero podría ser útil como su subproyecto que usa.

Lo que es, me parece que no se puede perder si ellos el tributo proyecto para cada proyecto, por lo que si usted tiene que claro, entonces no importa lo que decida que va a trabajar !!!!!!. Además de git es fácil.

Cuestiones relacionadas