2010-11-07 11 views
6

Trabajo en una empresa donde creamos muchas pequeñas aplicaciones específicas para clientes. Somos pocos desarrolladores pero la mayoría de las veces solo hay un desarrollador por proyecto.¿DVCS (Mercurial) no es para mí?

Customer1 
    ProjectX 
     App 
     Tests 
    ProjectY 
     App 
     Tests 
Customer2 
    Project2 
Products 
    Product1 
Common 

Hoy todo se almacena en un único repositorio.

El proceso es simple.

  1. Un desarrollador adquiere un nuevo proyecto para un cliente
  2. Crear una nueva carpeta para el proyecto
  3. Código en el nuevo proyecto
  4. hacer algo de mantenimiento en otro proyecto
  5. Fecha de cambios a mantenimiento proyectar
  6. Más trabajo en el nuevo proyecto
  7. Comprobar en el nuevo proyecto
  8. Entrega al cliente

No hay etiquetado ni bifurcación. Las versiones anteriores se revisan según la fecha.

Este proceso ha servido bien durante muchos años, pero hay algunos puntos de dolor con la herramienta actual (CVS)

  • lenta. El proceso de pago lleva minutos, incluso si nada ha cambiado. El historial se almacena en el servidor, por lo que diffs lleva demasiado tiempo
  • Agregando nuevos proyectos. Si trabajó con CVS, sabrá que es como: agregar carpeta, agregar archivos en la carpeta, agregar la siguiente carpeta ...
  • No hay forma de evitar errores obvios (verificar binarios, etc.)
  • No admite el cambio de nombre lo cual hace refactorización necesaria aún más dolorosa.

He usado Mercurial en privado por un tiempo y me gustaría extenderlo a todos los desarrolladores.

Podría haberlo entendido mal, pero hay algunas cosas que no entiendo cómo implementar en nuestra organización.

CVS commits son solo carpetas actuales pero en mercurial son de amplio repositorio. En nuestro caso, significa que el mantenimiento del trabajo de mantenimiento en una carpeta también comprometerá aún cosas sin terminar en otra carpeta. (supongo que podríamos hacer en hg ci ./** modificados carpetas, pero esto no está permitido en combinación, al menos eso es lo que dice la documentación If you are committing the result of a merge, do not provide any filenames or -I/-X filters.)

La práctica común en Mercurial es tener un repositorio por proyecto.

Un repositorio por proyecto está bien para nosotros, pero crea otros problemas como:

Cómo gestionar múltiples repositorios en el servidor central?
Si un desarrollador crea un nuevo proyecto, eventualmente necesitará impulsar sus cambios.Sólo haciendo

hg push http://localhost:8000/Customer1/NewProject

bloquea el hg-servidor web con un volcado de pila feo y cuelga el cliente.

La manera en que yo entiendo es que el desarrollador necesita acceso al shell del servidor para añadir el nuevo repositorio a un archivo de configuración y reinicie hgweb

La alternativa es utilizar SSH o una parte (¿Hay beneficios usando SSH en lugar de un recurso compartido de archivos?)

cd Customer\NewProject 
hg init 
hg clone --noupdate --pull . //mercurialshare\Customer\Project 
echo "[paths]" >.hg\hgrc 
echo "default=//mercurialshare\Customer\Project" >>.hg\hgrc 

hg push 

obras, pero es un poco complicado para algunos de los desarrolladores

todos los desarrolladores necesitan tener todos los proyectos.
(En realidad, no todos pero muchos proyectos están vinculados por lo que deben estar presentes y lo más fácil es simplemente tener todos)

Con muchos proyectos existentes y nuevos agregados semanal necesitamos una manera de tirar de todos los proyectos en un solo ve y también clona nuevos.

Estaba pensando que subrepos podrían resolver el tirón "global", pero el la línea siguiente en la documentación es un sensacional

"Cuando nos comprometemos, Mercurial tratará de crear una imagen coherente del estado de la totalidad project y sus subrepos. Hace esto al intentar primero confirmar en todos los subrepos modificados y luego registrar el estado de todos los subrepos ".

Volviendo al problema del repositorio único de confirmaciones globales.

(intentado algunas variantes de hg ci .hgsub .hgsubstate <subrepo> pero .hgsubstate parecen ser actualizado sólo en confirmaciones completos. Los demás usuarios no podrán ver los cambios del proyecto sin una explícita hg pull --update en la carpeta del proyecto)

Mi pensamiento actual es tener una archivo por lotes en la raíz que extrae todos los proyectos

¿Alguna otra idea sobre cómo usar mercurial en nuestra organización?

Editar

Gracias por la respuesta. Actualmente estoy evaluando cómo un repositorio por proyecto funcionará para nosotros. Pongo un archivo por lotes en el nivel superior

FOR /F %%x IN (repolist.txt) DO (
    If EXIST .\%%x\.hg (
     ECHO Pull %%x 
     hg pull --update --repository .\%%x 
    ) ELSE (
     ECHO Clone %%x 
     mkdir .\%%x 
     hg clone --pull %1\%%x .\%%x 
    ) 
) 
+0

["El hecho de que pueda usar un DVCS de forma distribuida no significa que deba hacerlo"] (http://stackoverflow.com/q/3854611) –

Respuesta

8

Su razón al decir que Mercurial está diseñado para un proyecto por cesión temporal. También es mucho más agradable cuando trabajas así porque la historia de los diferentes proyectos se mantiene separada.

Intentar tener múltiples proyectos en un repositorio de DVCS solo causa dolor.

Personalmente, prefiero atender proyectos a través de SSH en lugar de HTTP. Una de las razones es la capacidad de ...

# hg init blah 
# hg clone blah ssh://server/blah 

Si usted está sirviendo a través de HTTP esto no funciona (como se ha averiguado).Sin embargo, me sorprende que cause un colapso duro: -/

El método de sub-repos para obtener todos los proyectos no es exactamente como usted lo describe. No es que haya vuelto a los compromisos globales (los proyectos se pueden desarrollar individualmente), sino que el superproyecto almacena la versión de los subproyectos de los que depende. Esto es exactamente lo que desea si tiene (por ejemplo) una biblioteca como subproyecto, pero la versión depende de una versión específica. Efectivamente, un enlace de sub-repo es un marcador en otro repo en una versión específica.

No es lo que buscas.

Posiblemente, las cosas comunes deberían ser un sub-repo de los proyectos que lo necesitan. Cada proyecto puede congelarse en una versión diferente del mismo código y no tiene problemas. Eso necesitaría un poco de reflexión.

De lo contrario, la idea del script es probablemente la más fácil.

Cuestiones relacionadas