This was one of my project proposals for the Interactivos’13 open-source projects workshop in Madrid. It didn’t get selected in the end, but if you feel inspired by this or want to implement this … feel free to do so. This piece is open content licenced under CC BY 3.0 or at your option, any later version.
Version control software like git makes collaboration between programmers quite seamless: it can merge together their changes and lets them revert unwanted changes. Not so for artists and designers, where collaboration still can mean mailing files around with timestamps in filenames. That’s slow and error prone, not the fun of simultaneous collaboration.
Projects like SparkleShare improve on that, bringing git to designers (and designers love it). But git was originally made for source code and not images, so it’s always a manual editing effort to merge changes from two designers who did parallel changes to the same version of an artwork. Resolving all these conflicts manually is also no fun, and effectively blocks designers from experiencing git’s true power: branching, for example. You could do some experimental changes to some artwork, exploring your own path or paths, while your collaborators proceed on the main version, fixing little flaws for example. Once you agree what experimental changes to include in the main version, git should do so for you. For source code, git can do so automatically. For GIMP images (or maybe MyPaint, Inkscape or Scribus files instead), this project will extend git with that ability.
An additional aspect of this project is that it complements the “Fork Me on Art Hub” project proposal, which is a git based art sharing platform with novel features that encourage collaboration between artists and those still considered “consumers of art”. However, this project can also function without that special platform, as it can work with every git repository (like from GitHub, Gitorious, Bitbucket, or self-hosted).
Finally, here’s the main technical innovation of this “Git for GIMP” project: “change instructions” for raster images. For now, when SparkleShare stores a new image version into a git repository, it does so as a binary file. Git can compare it to the earlier version and store only the binary diff to save space (see “git gc”), but it does not understand about its inner structure, so it does not know how to merge parallel changes. After this project, git will instead store an image version as aggregated “change instructions” for a base image. Informal examples of change instructions would be:
- move layer “person 1” by 14 px to right and by 30 px to top
- change transparency of layer “flare” to 30%
- change image data of layer “shadow” by combining it with the attached overlay layer (which has RGBA enabled)
The last type allows git even to merge changes to the actual image data of the same layer. Namely, if they don’t conflict (don’t affect the same pixels). Note that working with image files is no different with this extended git: when checking out a specific version, git will apply the relevant change instructions to the base version and provide the requested version in your file system.
The “Project Summary” contains all the major points about this project already, so here are just some more details about the idea and possible implementation, in a quite random order, one detail per paragraph:
The current situation of images in git / svn. There are several options to add handling of binary data to git [examples]. It seems that changes only create small increments in repo size (at least when using “git gc” garbage collection). This would be the same as in SVN then, as discussed with a Pixelnovel Timeline developer. However in all these cases, git and svn do not yet understand about the inner structure of the image files, so they cannot automatically merge non-conflicting changes.
The user’s experience. From a user’s perspective, the software should act mostly like SparkleShare (and will probably indeed be based on it!). So, a designer’s work is synced to a central git repository and from there to teammates automatically whenever a change is saved. However, to enable advanced versioning like git branching, there will be a little git plugin for the chosen graphics application, probably GIMP, to enter the git commit message, choose or create a branch, revert to a prior version (ideally with thumbnail preview) and so on.
GIMP or Inkscape? The proposal is here so far to build a tool for putting OpenRaster images (from GIMP or MyPaint) into git repositories. This requires a completely new tool to extract the “change instructions” mentioned above, and to build new OpenRaster images by applying them. If that’s too complex for a two-week workshop, a similar approach can be done for Inkscape’s SVG files. With the advantage that they are XML text already, so it will require little effort to teach git how to merge parallel changes. The main effort would then be to develop a user-friendly git plugin for Inkscape that designers will love to use. (It should show incoming “pull requests” notifications when others have done changes to an open file, and the designer would accept them with a single click.)
OpenRaster, not XCF. In case that a pixel based graphics application is chosen for this project (like GIMP, which is the current proposal), it is advisable to use the OpenRaster format for storing the images. So, not GIMP’s native XCF format, which is not recommeded as a data interchange format and mostly represents GIMP’s internal data structures [source]. OpenRaster is included in GIMP since version 2.7.1 or 2.8 [source]. The additional advantage of OpenRaster is that it benefits multiple applications (like MyPaint) and allows collaboration between them. A disadvantage is that it is still quite a new, not much adopted file format – but nonetheless the proposed open standard format for raster images. Apart from OpenRaster and XCF, TIFF would be the only other format that could be used. However the modes of saving layer metadata etc. are normally proprietary, as TIFF is basically just a container format.
Deriving instructions from GIMP history? In GIMP’s case, these “change instructions” might be derived from the GIMP’s history feature. But maybe a better alternative is to derive them by comparing two versions of a saved file directly – as done in the world of source code by “diff”.
Inspirations from Pixelnovel Timeline and ComparePSD. The closest existing product for version control in images is Pixelnovel Timeline, and it offers a lot if insights for a great workflow and user interface when developing version control software for designers – see http://pixelnovel.com/timeline . It is based on the SVN version control system, however it can only do linear versioning and rollback and needs manual merging for changes derived in parallel from the same version. Also interesting for UI design in this project is the Pixelnovel ComparePSD tool for comparing PSD files layer by layer.
Inspirations from Kaleidoscope App. There is an app for visually comparing differeing versions of an image, to spot differences optically: Kaleidoscope.