2008-09-21 8 views
7

Si nuestra organización fuera a cambiar de un VCS de servidor central como la subversión a un VCS distribuido como git, ¿cómo me aseguro de que todo mi código esté a salvo de fallas de hardware?¿Cómo puedo asegurarme de que mi código de git repo es seguro?

Con un servidor central VCS solo necesito hacer una copia de seguridad del repositorio todos los días. Si estuviéramos utilizando un DVCS, habría muchas ramas de código en todas las máquinas de desarrollo, y si ese hardware fallara (o un desarrollador perdiera su laptop o se la robaran) entonces no tendríamos ninguna copia de seguridad .

Tenga en cuenta que no considero que sea una buena opción para "hacer que los desarrolladores envíen sucursales a un servidor" - eso es tedious y los desarrolladores terminarán no haciéndolo.

¿Hay alguna forma común de solucionar este problema?

algunas aclaraciones:

Con un servidor de forma nativa el centro-VCS continuación todo tiene que estar en el servidor central, excepto los cambios más recientes de los desarrolladores. Entonces, por ejemplo, si un desarrollador decide realizar una corrección de errores, esa rama se encuentra en el servidor central y está disponible para realizar una copia de seguridad de inmediato.

Si usamos un DVCS, el desarrollador puede hacer una sucursal local (y de hecho muchas sucursales locales). Ninguna de esas sucursales está en el servidor central y está disponible para realizar una copia de seguridad hasta que el desarrollador piense: "ah, sí, debo enviar eso al servidor central".

Así que la diferencia que estoy viendo (¡corríjame si me equivoco!): Las funciones a medio implementar y las correcciones de errores probablemente no estarán disponibles para la copia de seguridad en el servidor central si estamos usando un DVCS, pero estamos con VCS normal. ¿Cómo puedo mantener ese código seguro?

Respuesta

12

Creo que en la práctica los desarrolladores preferirán usar un repositorio central que empujar y tirar entre los repositorios locales de los demás. Una vez que hayas clonado un repositorio central, mientras trabajas en las ramas de seguimiento, ir y buscar son órdenes triviales.Agregar media docena de controles remotos a todos los repositorios locales de sus colegas es una molestia y estos repositorios pueden no ser siempre accesibles (apagados, en una computadora portátil llevada a casa, etc.).

En algún momento, si todos están trabajando en el mismo proyecto, todo el trabajo debe integrarse. Esto significa que necesita una rama de integración donde todos los cambios se combinen. Esto naturalmente debe ser accesible desde cualquier lugar por todos los desarrolladores, no pertenece, por ejemplo, en la computadora portátil del desarrollador principal.

Una vez que haya configurado un repositorio central, puede usar un flujo de trabajo de estilo cvs/svn para registrarse y actualizar. La actualización de cvs se convierte en git fetch y rebase si tienes cambios locales o simplemente git pull si no lo haces. cvs commit se convierte en git commit y git push.

Con esta configuración, se encuentra en una posición similar con su sistema VCS completamente centralizado. Una vez que los desarrolladores envían sus cambios (git push), que deben hacer para ser visibles para el resto del equipo, están en el servidor central y se les hará una copia de seguridad.

Lo que requiere disciplina en ambos casos es evitar que los desarrolladores mantengan cambios de larga ejecución fuera del repositorio central. La mayoría de nosotros probablemente haya trabajado en una situación en la que un desarrollador está trabajando en la función 'x', que necesita un cambio fundamental en algún código central. El cambio hará que todos los demás necesiten reconstruir por completo, pero la función aún no está lista para la transmisión principal, por lo que solo la vigilará hasta un momento adecuado.

La situación es muy similar en ambas situaciones, aunque existen algunas diferencias prácticas. Al usar git, debido a que puede realizar confirmaciones locales y puede administrar el historial local, es posible que el desarrollador individual no sienta tanto la necesidad de ingresar al repositorio central como algo parecido a cvs.

Por otro lado, el uso de confirmaciones locales se puede utilizar como una ventaja. Impulsar todos los compromisos locales a un lugar seguro en el repositorio central no debería ser muy difícil. Las sucursales locales se pueden almacenar en un espacio de nombre de etiqueta específico del desarrollador.

Por ejemplo, para Joe Bloggs, se podría hacer un alias en su repositorio local para realizar algo como lo siguiente en respuesta a (por ejemplo) git mybackup.

git push origin +refs/heads/*:refs/jbloggs/* 

Se trata de un mando único que se puede utilizar en cualquier momento (por ejemplo, al final del día) para asegurarse de que todos sus cambios locales están respaldados con seguridad hacia arriba.

Esto ayuda con todo tipo de desastres. La máquina de Joe explota y puede usar otra máquina, y guarda los commits guardados y continúa desde donde lo dejó. Joe está enfermo? Fred puede ir a buscar las ramas de Joe para agarrar ese arreglo de 'debe tener' que hizo ayer, pero no tuvo la oportunidad de probar contra el maestro.

Para volver a la pregunta original. ¿Es necesario que haya una diferencia entre dVCS y VCS centralizado? Usted dice que las funciones a medio implementar y las correcciones de errores no terminarán en el repositorio central en el caso de dVCS, pero yo afirmaría que no debe haber ninguna diferencia.

He visto muchos casos en los que una característica a medio implementar se mantiene en una caja de trabajo de desarrolladores cuando se usa VCS centralizado. O bien adopta una política que permite que la mitad de las características escritas se registren en la secuencia principal o se debe tomar una decisión para crear una rama central.

En el dVCS, puede ocurrir lo mismo, pero se debe tomar la misma decisión. Si hay un trabajo importante pero incompleto, debe guardarse centralmente. La ventaja de git es que crear esta rama central es casi trivial.

1

No es raro utilizar un servidor "central" como autoridad en DVCS, que también le proporciona el lugar para realizar sus copias de seguridad.

0

Puede hacer que los directorios de inicio del desarrollador monten dispositivos remotos a través de la red local. Entonces solo tiene que preocuparse por hacer que el almacenamiento en red sea seguro. O tal vez podría usar algo como DropBox para copiar su repositorio local en otro lugar sin problemas.

+0

directorios de inicio montamos dispositivos remotos a través de la red local
Lo hemos intentado anteriormente, y suele ser desastroso debido al retraso de la red. Eso, y significa muchas más cosas para las cintas de respaldo. –

3

Creo que es una falacia que usar un VCS distribuido necesariamente significa que debe utilizarlo de una manera completamente distribuida. Es completamente válido establecer un repositorio git común y decirle a todos que el repositorio es el oficial. Para el flujo de trabajo de desarrollo normal, los desarrolladores obtendrían cambios del repositorio común y actualizarían sus propios repositorios. Solo en el caso de dos desarrolladores que colaboran activamente en una función específica, es posible que necesiten extraer los cambios directamente el uno del otro.

Con más de unos pocos desarrolladores trabajando en un proyecto, sería muy tedioso tener que recordar para sacar los cambios de todos los demás. ¿Qué harías si no tiene tiene un repositorio central?

En el trabajo tenemos una solución de copia de seguridad que respalda todos los directorios de trabajo de todos los días, y escribe todo el lote a un DVD semanalmente. Entonces, aunque tenemos un repositorio central, cada copia individual también se respalda.

+0

Greg: He aclarado la pregunta para resaltar que estoy hablando de la mitad de la implementación de funciones/ramas de errores. VCS o DVCS tendrían que ser un servidor central para lanzamientos y demás. –

0

Todos los desarrolladores en su equipo también pueden tener sus propias sucursales en el servidor (pueden ser por boleto o solo por desarrollador, etc.). De esta forma, no rompen la compilación en la rama maestra, pero aún así pueden llevar su trabajo al servidor que se respalda.

My own git_remote_branch herramienta puede ser útil para ese tipo de flujo de trabajo (Tenga en cuenta que requiere Ruby). Ayuda a manipular ramas remotas.

Como nota al margen, hablando de repo safety, en su servidor puede configurar un enganche postcompromiso que hace una simple clonación git o git push a otra máquina ... Usted obtiene una copia de seguridad actualizada después de cada ¡cometer!

0

Utilizamos rsync para hacer una copia de seguridad de los directorios .git de desarrolladores individuales en un directorio en el servidor. Esto se configura usando scripts de envoltura alrededor de git clone, y los ganchos de post-commit, etc.

Como se hace en los ganchos post *, los desarrolladores no necesitan recordar hacerlo manualmente. Y debido a que usamos rsync con un tiempo de espera, si el servidor se cae o el usuario está trabajando de forma remota, todavía pueden funcionar.

1

Encuentro que esta pregunta es un poco extraña. Suponiendo que está utilizando un sistema de control de versiones no distribuidas, como CVS, tendrá un repositorio en el servidor central y un trabajo en progreso en los servidores de los desarrolladores. ¿Cómo se hace una copia de seguridad del repositorio? ¿Cómo respaldas el trabajo de los desarrolladores en progreso? La respuesta a esas preguntas es exactamente lo que tienes que hacer para manejar tu pregunta.

Usando el control de la versión distribuida, los repositorios en los servidores de los desarrolladores están en proceso. ¿Quieres respaldarlo? ¡Entonces haz una copia de seguridad! Es tan simple como eso.

Tenemos un sistema de copia de seguridad automatizado que toma cualquier directorio de nuestras máquinas que especifiquemos, así que agrego todos los repositorios y copias de trabajo en mi máquina, incluyendo los repositorios de git y CVS.

Por cierto, si está utilizando el control de versión distribuida en una empresa que libera un producto, entonces tendrá con un depósito central. Es de quien liberaste. Puede que no esté en un servidor especial; podría estar en el disco duro de algún desarrollador. Pero el repositorio que libera es el repositorio central. (Supongo que si aún no has lanzado, es posible que aún no tengas uno). Siento que todos los proyectos tienen uno o más repositorios centrales. (Y realmente si tienen más de uno, son dos proyectos y uno es un tenedor.) Esto también se aplica a código abierto.

Incluso si no tiene un repositorio central, la solución es la misma: copia de seguridad en las máquinas del desarrollador. Deberías haber estado haciendo eso de todos modos. El hecho de que el trabajo en progreso se encuentre en repositorios distribuidos en lugar de copias de trabajo de CVS o directorios rectos no versionados es irrelevante.

+0

No realizamos una copia de seguridad de las estaciones de trabajo para desarrolladores (es costoso cuando tiene cientos de ellas) y las alentamos a registrarse varias veces al día. Entonces solo tenemos que hacer una copia de seguridad del servidor. Esa no es una opción con git. –

+0

Usted sigue exactamente en el mismo barco, haciendo exactamente la misma pregunta: ¿realiza una copia de seguridad del trabajo de desarrollador en curso o no? Has elegido no hacerlo.El control distribuido de versiones no empeora ni mejora esa situación. – skiphoppy

+0

Lo que hay que tener en cuenta es que el control de versión distribuida no distribuye el código en muchas máquinas. Lo único que se distribuye en muchas máquinas es el trabajo en progreso, del que ya no se está realizando una copia de seguridad. En algún lugar será el repositorio o repositorios que libere; respalda esos. – skiphoppy

Cuestiones relacionadas