2009-12-10 15 views
17

Casi cualquier IDE crea muchos archivos que no tienen nada que ver con la aplicación que se está desarrollando, son generados y gestionados por el IDE para que sepa cómo crear la aplicación, dónde está el depósito de control de versiones, etc.¿Qué poner bajo control de versión?

¿Deberían mantenerse esos archivos bajo control de versión junto con los archivos que realmente tienen algo que ver con la aplicación (código fuente, archivos de configuración de la aplicación, ...)?

Las cosas son: en algunos IDE si crea un proyecto nuevo y luego lo importa en el repositorio de control de versiones utilizando el cliente/comandos de control de versiones incrustados en el IDE, entonces todos esos archivos se envían al respitory. Y no estoy seguro de que sea correcto: ¿qué dos desarrolladores diferentes que trabajan en el mismo proyecto quieren usar dos IDEs diferentes?


quiero mantener esta pregunta agnóstico evitando referencias a cualquier sistema de IDE en particular, lenguaje de programación o de control de versiones. Por lo que esta cuestión no es exactamente lo mismo que éstos:

+0

Vea también http://stackoverflow.com/questions/116121/do-you-keep-your-project-files-under-version-control/119377#119377 – VonC

Respuesta

18

Reglas de oro:

  1. incluyendo toda la que tiene una influencia sobre el resultado de la acumulación (opciones del compilador, codificaciones de archivo, ASCII/ajustes binarios, etc.)
  2. Incluir todo para que sea posible abrir el proyecto de una obtención limpia y ser capaz de compilar/ejecutar/prueba/debug/desplegarlo sin ninguna intervención manual adicional
  3. no se incluyen los archivos que contienen las rutas absolutas
  4. Evitar incluyendo personal preferencias (tamaño de pestaña, colores, posiciones de ventana)

Siga las reglas en este orden.

[Actualización] Siempre surge la pregunta de qué debería pasar con el código generado. Como regla general, siempre los pongo bajo control de versiones. Como siempre, tome esta regla con un grano de sal.

Mis razones:

de versiones código generado parece una pérdida de tiempo. Se genera ¿verdad? ¡Puedo recuperarlo presionando un botón!

¿De verdad?

Si tuviera que morder la bala y generar la misma versión exacta de alguna versión anterior sin falta, ¿cuánto esfuerzo sería? Al generar código, no solo tiene que obtener todos los archivos de entrada correctos, sino que también debe volver el tiempo atrás para el generador de código. ¿Puedes hacer eso? ¿Siempre? ¿Tan fácil como sería verificar una cierta versión del código generado si lo pusiera bajo control de versión?

E incluso si pudiera, ¿alguna vez podría estar seguro de que no se perdió algo?

Por un lado, poner código generado bajo control de versiones tiene sentido ya que hace que sea más fácil hacer lo que VCS significa: retroceder en el tiempo.

También hace que sea fácil ver las diferencias. Los generadores de código también tienen errores.Si soluciono un error y tengo 150'000 archivos generados, me ayuda mucho cuando puedo compararlos con la versión anterior para ver que a) el error desapareció yb) nada else cambió inesperadamente. Es la parte inesperada de la que debes preocuparte. Si no lo hace, hágamelo saber y me aseguraré de que nunca trabaje para mi empresa alguna vez :-)

El principal punto de dolor de los generadores de código es la estabilidad. No funciona cuando el generador de código simplemente escupe un desorden aleatorio de bytes cada vez que se ejecuta (bueno, a menos que no le importe la calidad). Los generadores de código deben ser estables y deterministic. Los ejecuta dos veces con la misma entrada y la salida debe ser idéntica al bit menos significativo.

Así que si no puede verificar el código generado porque cada ejecución del generador crea diferencias que no están allí, entonces su generador de código tiene un error. Arreglalo. Ordene el código cuando sea necesario. Usa mapas hash que conservan el orden. Haga todo lo necesario para que la salida no sea aleatoria. Al igual que lo haces en cualquier otro lugar en tu código.

El código generado que podría no estar bajo el control de versiones sería la documentación. La documentación es algo así como un objetivo suave. No importa tanto cuando regenero la versión incorrecta de los documentos (por ejemplo, tiene más o menos errores tipográficos). Pero para las versiones, podría hacer eso de todos modos para poder ver las diferencias entre lanzamientos. Puede ser útil, por ejemplo, para asegurarse de que las notas de la versión estén completas.

Tampoco compruebo los archivos JAR. Como tengo el control total sobre la versión completa y la confianza total de que puedo recuperar cualquier versión de las fuentes en un minuto y sé que tengo todo lo necesario para construirlo sin ninguna otra intervención manual, ¿por qué necesitaría la ejecutables para? Una vez más, podría tener sentido incluirlos en un repositorio de publicación especial, pero luego, mejor mantener una copia de los últimos tres años en el servidor web de su compañía para descargar. Piensa: Comparar binarios es difícil y no te dice mucho.

+1

Agregaría dos reglas "Evite todo lo que pueda generarse a partir de otros incluidos archivos "y" Evitar todo lo que cambie con frecuencia y automáticamente " – sfussenegger

+1

Las Reglas 1 y 2 son totalmente incorrectas. Se aplican al tarball de distribución, pero NO al VCS. –

+6

Estoy de acuerdo con 1 y 2 100%. Es muy importante poder obtener una copia de la fuente, escribir "ant run" o somesuch, y estar activo. Incluso incluiré la fuente o el binario de una biblioteca de la que dependo. Estoy totalmente feliz con este enfoque; es mucho mejor que requerir que todos los desarrolladores descarguen e instalen algo cada vez que hay una nueva dependencia. –

2

Anythi ng que sería devastador si se perdiera, debería estar bajo control de versión.

+0

"... debería estar bajo control de versión" ¿decir? :) – mmutilva

+0

@Toto - Muy bien. –

3

Aquí es donde build automation y construir archivos vienen en.

Por ejemplo, todavía se puede construir el proyecto (los dos desarrolladores tendrán el mismo software acumulación obviamente) pero luego a su vez podría utilizar dos IDE es diferente.

En cuanto a la 'basura' que se genera, tiendo a ignorar a la mayoría si lo hace. Sé que esto pretende ser independiente del lenguaje, pero considere Visual Studio. Genera archivos de usuario (configuración de usuario, etc.) esto no debería estar bajo control de fuente.

Por otro lado, los archivos de proyecto (utilizados por el proceso de compilación) seguramente deberían. Debo agregar que si está en un equipo y todos han acordado un IDE, entonces el control de los archivos IDE específicos está bien siempre que sean globales y no sean específicos del usuario y/o no sean necesarios.

Esas otras preguntas hacen un buen trabajo al explicar lo que se debe o no controlar en el control de fuente, así que no las repetiré.

2

En mi opinión, depende del proyecto y el entorno. En un entorno de empresa donde todo el mundo utiliza el mismo IDE, puede tener sentido agregar los archivos IDE al repositorio. Si bien esto depende un poco del IDE, ya que algunos incluyen caminos absolutos para las cosas.

Para un proyecto que se desarrolla en diferentes entornos no tiene sentido y será doloroso a la larga ya que los archivos de proyecto no son mantenidos por todos los desarrolladores y hacen que sea más difícil encontrar cosas "relevantes".

+0

Mientras escribes, algunos IDE incluyen rutas absolutas, por lo que es un verdadero dolor de cabeza poner esos archivos. Además, ¿cuál es el beneficio? Si los 'archivos basura' se pierden, puede volver a generarlos, y no recuerdo una sola vez que necesité volver a una versión anterior de la configuración de un proyecto. –

+0

Según el idioma y el IDE que utilice estos archivos, incluyen instrucciones de compilación, configuraciones de compilación, ... que podría valer la pena compartir entre desarrolladores para usar configuraciones similares – johannes

5

Creo que lo mejor es poner cualquier cosa bajo control de versiones que ayude a los desarrolladores a comenzar rápidamente, ignorando todo lo que pueda generar automáticamente un IDE o herramientas de compilación (por ejemplo, el plugin eclipse de Maven genera .project y .classpath - no es necesario para verificar esto en). Evite especialmente los archivos que cambian con frecuencia, que no contienen más que las preferencias del usuario, o que entran en conflicto entre los IDE (por ejemplo, otro IDE que utiliza .project como lo hace eclipse).

Para los usuarios de eclipse, me resulta especialmente útil agregar el estilo de código (.settings/org.eclipse.jdt.core.prefs - formateado automático al guardar activado) para obtener código formateado consistentemente.

3

¡Todo lo que se puede generar automáticamente a partir de los archivos de configuración fuente + no debe estar bajo el control de la versión! Solo causa problemas y limitaciones (como el que usted indicó, utilizando 2 archivos de proyecto diferentes por diferentes programadores).

Es cierto no solo para IDE "archivos basura" sino también para archivos intermedios (como .pyc en python, .o en c, etc.).

0

En mi opinión, todo lo que se necesita para construir el proyecto (código, crear archivos, medios, bases de datos con información de programa requerida, etc.) debe estar en repositorios. Me doy cuenta de que, especialmente para los archivos de medios/bases de datos, esto es fantástico, pero para mí, si no puedes realizar una bifurcación y luego golpear construir, el control fuente no está haciendo su trabajo. Esto se duplica para sistemas distribuidos con creación/fusión de sucursales baratas.

¿Algo más? Guárdelo en otro lugar diferente. Los desarrolladores deben elegir su propio entorno de trabajo tanto como sea posible.

0

Por lo que he estado viendo con el control de versiones, parece que la mayoría de las cosas deberían incluirse en él, p. Ej. código fuente, etc. Sin embargo, el problema al que se enfrentan muchos VCS es cuando intentan manejar archivos grandes, generalmente binarios, y en ocasiones cosas como archivos de audio y gráficos. Por lo tanto, mi forma personal de hacerlo es poner el código fuente bajo control de versión, junto con gráficos generales de pequeño tamaño, y dejar los binarios a otros sistemas de administración. Si se trata de un archivo binario que creé utilizando el sistema de compilación del IDE, entonces definitivamente se puede ignorar, porque se va a regenerar en cada compilación. Para las bibliotecas de dependencia, bueno, aquí es donde entran los administradores de paquetes dependientes.

En cuanto a los archivos generados IDE (asumo que estos no se generan durante el proceso de compilación, como los archivos de solución para Visual Studio) - Bueno, creo que eso dependerá de si estás trabajando solo o no. Si trabaja solo, continúe y añádalo: le permitirán revertir la configuración en la solución o lo que sea que haga. Lo mismo ocurre con otros archivos que no son de solución también. Sin embargo, si está colaborando, entonces mi recomendación es no - la mayoría de los archivos generados por IDE tienden a ser, bueno, específicos del usuario - también funcionan en su máquina, pero no necesariamente en otros.Por lo tanto, es mejor que no incluya archivos generados por IDE en ese caso.

tl; dr debe poner la mayoría de las cosas relacionadas con su programa en control de versiones, excluyendo dependencias (cosas como bibliotecas, gráficos y audio deben ser manejadas por algún otro sistema de administración de dependencias). En cuanto a las cosas generadas directamente por el IDE, bueno, dependerá de si está trabajando solo o con otras personas.

Cuestiones relacionadas