2009-09-05 21 views
32

Estoy contribuyendo a un proyecto de código abierto bastante pequeño alojado en Github. Para que otras personas puedan aprovechar mi trabajo, he creado mi propio tenedor en Github. A pesar de la elección de la terminología de Github, no deseo desviarme totalmente del proyecto principal. Sin embargo, no espero ni deseo que todo mi trabajo sea aceptado en el repositorio principal. Algunos de ellos, sin embargo, ya se han fusionado en el repositorio principal y espero que esto continúe. El problema al que me estoy enfrentando es la mejor manera de mantener nuestros dos árboles en un estado donde el código se pueda compartir fácilmente entre ellos.Mejores prácticas para repositorios git en proyectos de código abierto

Algunas situaciones que tenga o que se encuentran incluyen:

  • encomiendo código que más tarde se acepta en el repositorio principal. Cuando retire de este repositorio en el futuro, mi confirmación se duplica en mi repositorio .
  • Confirmo código que nunca se acepta en el repositorio principal. Cuando salga de este repositorio en el futuro, los dos árboles se han separado y arreglarlo es difícil.
  • Llega otra persona y basa su trabajo en mi repositorio. Por lo tanto, debería, si es posible, evitar cambiar los commits que he presionado, por ejemplo, usando git rebase.
  • Deseo enviar el código al depósito maestro. Idealmente, mis cambios deberían poder transformarse fácilmente en parches (idealmente usando git format-patch) que puedan aplicarse directa y limpiamente al repositorio principal.

Por lo que yo puedo decir que hay dos, o posiblemente tres maneras de manejar esto, ninguna de las cuales funcionan particularmente bien:

  • pasan con frecuencia git rebase de mantener mis cambios basados ​​fuera de la cabeza de el repositorio aguas arriba De esta forma puedo eliminar compromisos duplicados pero a menudo tengo que reescribir la historia, causando problemas a las personas que quieren derivar su trabajo del mío.
  • Combine con frecuencia los cambios del repositorio en sentido ascendente en los míos. Esto funciona bien por mi parte, pero no parece que sea fácil enviar mi código al repositorio de subida.
  • Usa alguna combinación de estos y posiblemente git cherry-pick para mantener las cosas en orden.

¿Qué han hecho otras personas en esta situación? Sé que mi situación es análoga a la relación entre varios colaboradores del kernel y el repositorio principal de Linus, así que espero que haya buenas maneras de manejar esto. Sin embargo, soy bastante nuevo en git, así que no he dominado todos sus matices. Finalmente, especialmente debido a Github, mi terminología puede no ser del todo coherente o correcta. Sientase libre de corregirme.

+0

Tenga en cuenta que incluso si usted (fuerza) impulsa sus cambios reestadificados, otras personas también pueden tirar fácilmente con rebase para actualizar. Es solo otro taller donde la historia se reescribe continuamente en todas partes. Además de eso, debes ser un poco más cuidadoso debido a la fuerza de empuje que puede eliminar todo :) – rubenvb

Respuesta

17

Algunos consejos que he aprendido de una situación similar:

  • tienen una sucursal de seguimiento a distancia para el trabajo del autor original.
  • Extraiga los cambios de esta rama de seguimiento a su rama principal cada cierto tiempo.
  • Crea una nueva rama para cada uno de los temas en los que estás trabajando. Estas ramas generalmente deben ser locales solamente. Cuando obtiene cambios desde el nivel anterior al maestro, modifique las ramas de tema para reflejar estos cambios.
  • Cuando haya terminado con algún tema de trabajo, combine con el maestro.De esta forma, las personas que están obteniendo trabajo de los suyos no verán demasiado historial reescrito, ya que el rebase se produjo en las ramas de tema locales.
  • Presentación de cambios: su rama principal consistirá básicamente en una serie de confirmaciones, algunas de las cuales son las mismas que las anteriores, el resto son suyas. Este último se puede enviar como parches si lo desea.

Por supuesto, su elección de nombres de sucursales y mandos a distancia es suya. No estoy seguro de que estos sean exhaustivos para el escenario, pero cubren la mayoría de mis obstáculos.

+0

En el tiempo desde que hice esta pregunta, he adquirido mucha más experiencia con Git y me he decidido por esto como la mejor respuesta. Mantener los cambios en desarrollo solo como confirmaciones locales es la clave. Definitivamente un muy buen consejo. Gracias. – orangejulius

+0

¿Alguna vez trabajó en una rama temática en más de una computadora? Si asi es, ¿Qué hiciste? –

+1

No, no he trabajado en ramas temáticas en computadoras, pero no es la parte de "across computers" lo que es difícil. Es la "gente del otro lado" que es. También puede enviar fácilmente sus ramas de tema al servidor para que _you_ pueda trabajar con él. – sykora

Cuestiones relacionadas