Escribir mi propio progtwig de control de versiones de files

Existe lo que parece ser una plétora de sistemas de control de versiones. Por lo tanto, para sacar una mala conclusión, debe ser fácil escribir una.

¿Cuáles son algunos problemas que deben tenerse en count para escribir un sistema simple de control de versiones de files? (¿Cuáles son las funciones mínimas necesarias?)

¿Es una tarea factible para una persona?

Un buen lugar para aprender sobre el control de versiones es el Weblog de Eric Sink . Su artículo más reciente es Time and Space Tradeoffs en Version Control Storage , por ejemplo.

Otro buen ejemplo es su serie de artículos Source Control HOWTO . Sí, se trata de cómo utilizar el control de fuente, pero tiene mucha información sobre las decisiones y las ventajas que los desarrolladores deben tener al diseñar el sistema. El mejor ejemplo de esto es probablemente su artículo sobre Repositorios , donde explica diferentes methods de almacenamiento de versiones. Realmente aprendí mucho de esta serie.

Que simple?

Podría decirse que podría escribir un sistema de control de versiones con un script de shell de una línea, upversion.sh:

cp $WORKING_COPY $REPO/$(date +"%s") 

Para grandes activos binarys, ¡eso es básicamente todo lo que necesitas! Se podría mejorar con bastante facilidad, por ejemplo, haciendo que las carpetas de versión sean de solo lectura, quizás grabando metadatos con cada versión (podría tener un file de text a $REPO/$(date...).meta por ejemplo)

Eso suena como una gran simplificación, pero no está lejos de los sistemas de gestión de activos que utilizan muchas instalaciones de postproducción de películas (por ejemplo)

Realmente necesita saber qué versión desea y por qué …

Con los activos binarys grandes (por ejemplo, video), debe centrarse en las herramientas para comparar visualmente las versiones. Probablemente también necesites lidiar con dependencies ("Necesito image123.jpg y video321.avi para generar esta image")

Con el código, necesitas enfocarte en cosas como hacer que las diferencias entre dos versiones sean realmente fáciles. Además, dado que las modificaciones en el código fuente suelen ser pequeñas (unos pocos caracteres de un proyecto con muchos miles de líneas), sería terriblemente ineficiente copyr todo el proyecto para cada versión, por lo que solo almacena las diferencias entre cada versión ( encoding delta )

Para versionar una database, probablemente desee almacenar información en el esquema, rastrear nuevas tablas o columnas, o ajustar las existentes (en lugar de calcular deltas de los files de la database o hacer copys como los dos sistemas anteriores)

No hay una manera perfecta de versionar todo, tienes que concentrarte en hacer una cosa bien. Git es ideal para text, pero no para files binarys. Adobe Version Cue es genial con files binarys (imágenes), pero inútil para el text …

Supongo que las cosas a considerar se pueden resumir como …

  • ¿Qué quieres versionar?
  • ¿Por qué no puedo usar (o extender / modificar) un sistema existente?
  • ¿Cómo rastrearé las diferencias entre versiones? (¿files integers? deltas?)
  • ¿Qué otros datos necesito adjuntar a las versiones? (¿Autor, timestamp, dependencia?)
  • ¿Qué tareas necesitaría hacer un usuario comúnmente (difiriendo? ¿Revertir files específicos?)

Eche un vistazo a la pregunta " conceptos centrales " sobre (D) VCS.
En resumen, escribir un VCS implicaría tomar una decisión sobre cada uno de estos conceptos centrales (Central vs. Distribuido, lineal vs. DAG, centrado en files vs. repository centrado, …)

No es un proyecto "rápido", creo;)

Esa ES realmente una mala conclusión. Mi opinión personal aquí es que el dominio del problema es tan amplio y, por lo general, difícil que nadie lo haya logrado "correctamente", por lo que las personas intentan resolverlo una y otra vez, desde diferentes angularjs y bajo diferentes suposiciones.

Eso, por supuesto, no significa que no deberías intentarlo. Solo se advirtió que muchas personas inteligentes estaban allí antes que tú, por lo que debes hacer tu tarea.

Si eres Linus Torvalds, puedes escribir algo como Git en un mes.

Pero "un sistema de control de versiones" es un concepto tan vago y elástico, que su pregunta es realmente incontestable.

Consideraría preguntarte qué quieres lograr (aprender sobre VCS, aprender un idioma, …) y luego definir un objective claro. Es bueno tener un proyecto, pero también es bueno tener un objective alcanzable en una pequeña cantidad de time. Pequeños éxitos son buenos para tu moral.

Un buen algorithm delta, buena compression y eficiencia de la networking.

Uno simple es factible por una persona para una oportunidad de aprendizaje. Un problema que puede considerar es cómo almacenar eficientemente deltas de text sin formatting. Un formatting delta muy popular es el de RCS (utilizado por muchos progtwigs de control de versiones). Es posible que desee estudiarlo para get ideas.

Lo que podría darte una buena visión general de una manera less técnica es The Git Parable . Es una buena abstracción sobre los principios de git, pero da una muy buena comprensión de lo que un VCS debería ser capaz de realizar. Todas las cosas más allá de esto son decisiones de "bajo nivel".

Para escribir una testing de concepto, probablemente podría llevarlo a cabo, implementar o tomar prestadas las herramientas que Alan menciona.

En mi humilde opinión, el aspecto más importante de un VCS es la facilidad de uso. Esto suena como una afirmación extraña, pero cuando lo piensas, el espacio en el disco duro es uno de los productos informáticos más fáciles de escalar horizontalmente, por lo que se tolerará una mala compression o incluso deltas descuidados reales. La razón principal por la que las personas demandan una mejora en los sistemas de control de versiones es para realizar tareas comunes de forma más intuitiva o para admitir más funciones que las personas eventualmente demandan pero que no eran obvias antes del lanzamiento. Y dado que las herramientas de control de versiones tienden a ser monolíticas y completamente integradas en una empresa, el costo de cambio es alto y es posible que no sea posible admitir una nueva característica sin romper un repository existente.

El prerrequisito mínimo necesario es un set de testings exhaustivo y preciso. Nadie (incluido usted) querrá utilizar su nuevo sistema a less que pueda demostrar que funciona, confiable y completamente libre de errores.