2009-04-24 28 views
28

Recientemente comencé a entrar en Git en un proyecto personal, y puedo ver cómo un DVCS podría beneficiarnos en el trabajo (que es una gran empresa de software empresarial, que actualmente ejecuta Perforce). El trabajo de características en mi equipo, por ejemplo, consiste principalmente en desarrolladores que crean sus propias sucursales; a veces estos se comparten entre pequeños equipos de desarrolladores. Creo que sería más eficiente en esta instancia usar un DVCS.¿Cómo se usan DVCS en equipos grandes?

En el caso más general, sin embargo, me gustaría saber de las personas que usan un DVCS en el trabajo, en equipos medianos y grandes.

  1. ¿Cómo lidiar con las fusiones en N-way? ¿Es esto incluso un escenario común? Mercurial solo admite fusiones en N forma haciendo fusiones bidireccionales (N-1) (y read que esta es la solución preferida en otros DVCS), lo que suena como un proceso muy laborioso incluso para relativamente pequeñas N.
  2. ¿Usted usar un único repositorio central autorizado, o es realmente P2P?
  3. ¿Los desarrolladores a menudo empujan y extraen el código entre sí, o todo pasa por el repositorio central?
+0

Espero que no esté cerca rápidamente, creo que es una muy buena pregunta.Lamentablemente, no estoy calificado para responder, solo uso git en proyectos personales, ya que el trabajo está bastante retrasado, todavía uso CVS para algunos proyectos y svn para otros. En su mayor parte, parece que las personas que usan svn piensan que son "modernas". :-) – Benson

+4

Creo que encontrarás muchos lugares de trabajo (como el mío) donde la respuesta real a esta pregunta es "en privado" o "sin el conocimiento del resto del equipo". –

+0

Desafortunadamente, parece que la mejor respuesta fue realmente para un equipo pequeño. ¿Hay alguien haciendo esto con equipos en los 50 - 100+? –

Respuesta

13

Mi equipo de mi empleador anterior usó Git, y funcionó bien para nosotros. No éramos tan grandes (tal vez 16 o así, con quizás 8 committers realmente activos?), Pero tengo respuestas a sus preguntas:

  1. Las fusiones de N-Way no son terriblemente comunes. Se nos ocurrieron algunas convenciones sobre nombres de sucursales que nos permitieron escribir scripts que facilitaron el proceso de "liberación de ingeniería" (utilizo comillas de susto porque no teníamos un ingeniero de versiones), y las personas crearían ramas de características privadas, pero rara vez tuvo un problema con la fusión de más de dos ramas (ver el siguiente).
  2. (y # 3).Teníamos un repositorio central en un servidor de desarrollo por tres razones: (a) La máquina de desarrollo tenía un RAID5 (más tolerante a fallas) y copias de seguridad nocturnas (las estaciones de trabajo dev no eran todas las noches), (b) las versiones de producción se creaban en el servidor de desarrollo. y (c) tener un repositorio central simplificado de scripting. Como resultado, las fusiones en N simplemente nunca sucedieron. Lo más parecido que tuvimos a N-way fue cuando alguien se fusionó lateralmente y luego se fusionó verticalmente.

Git fue una gran cosa para nosotros debido a su alto grado de flexibilidad; sin embargo, tuvimos que establecer algunas convenciones (nombres de ramas y etiquetas, ubicaciones de repositorios, scripts, etc., proceso) o podría haber sido un poco caótico. Una vez que configuramos las convenciones, la flexibilidad que teníamos era simplemente fantástica.

Actualización: nuestras convenciones básicamente eran así:

  • un directorio en nuestro servidor NFS que albergaba todos los depósitos centrales
  • que teníamos varios proyectos que comparten componentes, por lo que les estalló en las bibliotecas, en esencia, con sus propios repositorios, y los proyectos entregables simplemente los incluyeron como submódulos de git.
  • no eran cadenas de versión y suelte los nombres que se nos imponen desde arriba, por lo que sólo utiliza una variantes de esas como nombres de rama
  • Del mismo modo, para las etiquetas, siguieron los nombres de liberación procesos dictado
  • los proyectos entregables contenidos un archivo de propiedades que leí en los guiones del intérprete de comandos, y eso me permitió escribir un solo guión para gestionar el proceso de lanzamiento para todos los proyectos, aunque cada uno tenía pequeñas variaciones en el proceso; las variaciones se contabilizaron en esos archivos de propiedades
  • Escribí scripts que reconstruirían un paquete entregable desde cualquier etiqueta
  • usando git al nos bajó para controlar el acceso usando PAM y/o permisos de usuario normales (ssh, etc.)
  • Hubo otras convenciones que son más difíciles de poner en una lista con viñetas, como cuando las fusiones deberían suceder. Realmente, yo y otro hombre somos una especie de "git gurus" internos, y ayudamos a todos a descubrir cómo usar las ramas y cuándo fusionarse.
  • hacer que la gente se comprometa en trozos pequeños y no dejar caer bombas-dif en la rama principal fue un desafío. Un hombre dejó caer aproximadamente dos semanas de trabajo en un compromiso, y finalmente tuvimos que resolverlo todo. Un enorme pérdida de tiempo, y frustrante para todos.
  • comentarios informativos y detallados para ir con compromete

Había otras cosas que se aprende como su equipo se experimenta y aprende a trabajar unos con otros, pero esto fue suficiente para que podamos empezar.

actualización: cualquiera que siga este tipo de cosas a estas alturas ya lo sabe, pero Vicente Dreissen ha escrito un sólido y bastante completa (pero no exaustive) take on branching and release engineering using Git. Me animo a usar su proceso como un punto de partida porque, por dos razones:

  • un montón de equipos de hacerlo de esta manera o si está usando alguna variante cercana (incluyendo Linux, Git, y muchos otros equipos de proyecto OSS), que significa que este método ha sido probado y ajustado para tener éxito en la mayoría de las circunstancias. Es muy poco probable que enfrente un problema que no se haya enfrentado y resuelto dentro de las limitaciones de este modelo.
  • debido a lo anterior, casi cualquier ingeniero con experiencia en Git entenderá lo que está pasando. No tendrá que escribir documentación detallada sobre la naturaleza fundamental de su proceso de publicación; solo tendrá que documentar cosas específicas solo para su proyecto o equipo.
+0

Me gustaría recibir más información sobre sus convenciones y ejemplos de su flexibilidad. –

+0

Yo también :-) ¡Estaba en el medio de un comentario muy raro antes de que @Norman entrara con ese! – alastairs

+0

Bueno, una forma en que Git te da mucha flexibilidad es que tiene docenas de programas en lugar de solo uno grande. Eso suena desordenado, y lo es, pero eso le permite escribir algunos scripts realmente potentes al canalizar la salida de un comando a otro. Más o menos permite que POSIX sh sea el lenguaje de extensión de Git. Si eres hábil con las secuencias de comandos shell, eso es algo muy, muy poderoso. Ahora, en 2013, Git es más monolítico, pero su interfaz sigue siendo altamente programable, y eso incluye a Windows. PowerShell también hace un lenguaje de extensión muy agradable. –

1

Aquí es un ejemplo (por no decir un "universal" uno)

Hemos VCS centrales (ClearCase o la subversión, en función de los diferentes proyectos), y los estamos utilizando para desarrollos "oficiales" esfuerzos (desarrollo, parches, arreglos), donde el número de sucursales es limitado y está bien identificado.

Sin embargo, para los desarrollos de refactorización que implican una gran cantidad de estado intermedio, en el que nada funciona, y donde muchos desarrolladores tiene que tener su propia rama basada en la actividad o ramas, algunos repositorios Git se establece entre los desarrolladores, en una Forma P2P.
Una vez que el trabajo alcanza algún tipo de estabilidad 0.1, y las fusiones se reducen, se reimporta en el VCS, donde el trabajo puede continuar de una manera central y "ordenada".

Desde Git on Windows works well (MSysGit), nos las arreglamos para tener pequeños desarrollos iniciales hechos rápidamente por el lado de esa manera.

Todavía estamos evaluando a Git para un desarrollo de proyecto a gran escala.

+1

He encontrado el soporte de Windows para Git bastante pobre, IMO. MSysGit parece proporcionar una buena base, pero el hecho de que todo esté basado en MinGW (e históricamente solo se ejecutó en CygWin) es un poco desagradable. TortoiseGit (http://code.google.com/p/tortoisegit/) ayuda un poco, pero sigue siendo beta (posiblemente alfa, incluso). – alastairs

+0

Chiming en casi tres años después para decir que MSysGit ha recorrido un largo camino, y para los desarrolladores de Visual Studio no hay mucho mejor que el plugin GitExtensions. –

+0

@Justin ᚅᚔᚈᚄᚒᚔ: estoy de acuerdo, como detallé en http://stackoverflow.com/questions/1346031/is-perforce-worth-it/1346196#1346196 con una actualización de noviembre de 2011 sobre mi respuesta de 2009. – VonC

1

Probablemente sea mejor observar cómo funcionan los desarrolladores del kernel de Linux. Tienen un flujo de trabajo bastante complejo donde los cambios se envían desde muchas fuentes, y luego los desarrolladores de confianza para cada subsistema (llamados tenientes) incorporan los cambios, y cuando están contentos los envían a Linus, quien eventualmente los arrastra a su árbol o los rechaza Por supuesto, es más complejo que eso, pero eso es una descripción general.

5

He estado trabajando durante varios años con el equipo Glasgow Haskell Compiler utilizando Darcs. Recientemente (varios meses) comencé a usar git para mi propia copia del repositorio, tanto para el rendimiento como para mejorar mi educación.

  1. ¿Cómo lidiar con N-way merges?

    No hay combinaciones de N vías. Cada desarrollador origina una secuencia de parches, y los flujos se fusionan uno a la vez en cada repositorio. Entonces, si N desarrolladores hacen cambios simultáneamente, se fusionan en pares.

  2. ¿Utiliza un único repositorio central autorizado?

    Absolutamente. Es la única forma de saber qué es GHC y qué no.

  3. ¿Los desarrolladores a menudo empujan y extraen el código entre ellos, o todo pasa por el repositorio central?

    Creo que depende de los desarrolladores y del VCS que esté utilizando. En el proyecto de GHC casi todos los tirones y empujones que veo pasan por el depósito central. Pero hay un portero pesado (autoadministrado) que empuja hacia el repositorio central, y si un colega tiene una corrección de errores, necesito ahora, lo sacaré directamente de su repositorio. Con Darcs es muy fácil extraer solo un parche (en lugar de todo el estado como en git), y sé que mis compañeros deveopers, que tienen más experiencia con los darcs, usan esta característica mucho más que yo --- y les gusta mucho.

    Con git, cuando estoy trabajando en estrecha colaboración con otro desarrollador, con frecuencia crearé una nueva rama con el único propósito de compartirla con otra persona. Esa rama nunca llegará al repositorio central.

2

La justa famosa "Tech Talk: Linus Torvalds en git" explica cómo se utiliza para Linux (casi tan grande como el equipo que se me ocurre)

Si no recuerdo mal, su uso se se asemeja a una cadena de comando militar: cada módulo tiene un mantenedor que maneja las solicitudes de extracción de los desarrolladores, luego hay algunas personas "más confiables" que tratan de extraer datos de los mantenedores de los módulos en el repositorio kernel.org git oficial.

"Linux: Managing the Kernel Source With 'git'" también explica que, aunque de nuevo no es ninguna explicación concisa .. esquema

7

flujo de trabajo de whygitisbetterthanx:

alt git work-flow with integration manager http://whygitisbetterthanx.com/images/workflow-b.png

Para escalar este hasta aún más desarrolladores, sólo tiene que añadir otra capa de "tenientes de confianza" entre el gerente de integración y los desarrolladores.

+0

¿A qué se podrían traducir los "tenientes de confianza" en un entorno comercial/de propiedad? ¿Una característica principal? ¿Gerente de proyecto? ;-) No estoy seguro de que esto funcione tan bien en mi equipo, por ejemplo, donde tenemos un repositorio central de Perforce al que todos tienen acceso. Parece ineficiente (y no muy distribuido ...) hacer que una sola persona sea responsable de integrarse al repositorio bendito. – alastairs

+0

La otra cosa acerca de nuestro equipo es que no tenemos responsabilidades claras de funciones, como tal. Claro, cada uno de nosotros tiene nuestra propia experiencia en diferentes áreas, pero podemos movernos, trabajando en diferentes áreas del producto para diferentes proyectos. Esto parecería invalidar para nosotros el modelo de gerente de integración/dictador-teniente. – alastairs

+0

En un entorno empresarial, probablemente sea una mejor idea dividir proyectos si se vuelven demasiado grandes para un único administrador de integración. Pero no sobreestime el trabajo que un gerente de integración tiene que hacer: los desarrolladores son los que se aseguran de que sus cambios públicos se fusionen limpiamente con el HEAD del repositorio bendito. –

Cuestiones relacionadas