Hi all,
I am afraid that I do not know how to put this in a smaller mail, as I believe a bit of
historical background and theoretical background is in needed. But maybe I should split
this in 2 mails. First the background. You can skip this mail, if you believe you know all
this.
Before we used git, there was a lot of discussion how to to proper software configuration
management for our open source projects. One of the major problems was that a new version
of a package was usually a development versions, and might break the build and also other
projects. Metacello allowed us to solve this problem. As Dale always has pointed out, not
all projects are the same, so there is not one solutions fits all. This was reflected in
Metacello, that supported most (if not all) of these strategies. But just as we agreed on
using MIT for our licensing the open source projects, in the end there was agreement on
how to do make configurations.
There were baselines, that described what packages were used and where these packages
could be found
- no version information was included here, only the dependencies
There were concrete versions, that described what versions of packages belonged together
- all versions where explicit, also the versions of the projects used.These versions were
frozen.
We defined symbolic versions, that described on a meta level the versions (releases and
stable version)
- these versions where aliases to a concrete version, that could change over time, to
include bug fixes.
By moving our projects to GIT we could use the version management of GIT, and needed less
of Metacello.
In GIT we have good branch support, something that lacked in Metacallo. Using git means,
it is no longer necessary to define versions in Metacello. Each concrete or symbolic
version can be indicated by either tag, or a branch.
There is one special branch “master” that is implicitly the stable version. This is
supported by git tools, i.e. before merging a pull request in a branch, one can build this
pull request, verifying that it s indeed a stable version, and when this was in error, it
is easy to revert the change, but leaving this change available for further development.
For long term support of releases, one can create a branch (preferable recognisable by
calling it isomething like masterv2.3 or release2.3), and merge bug fixes into this branch
when applicable.
Also in GIT it is possible for each user to fork a project at a certain version, allowing
everyone to freeze a certain project to a certain version, and still be able to get
updates on changes, and giving the option to easily merge this change or bug fix into
their fork, or leave this change out.
Finally there is a method to refer to a specific version in GitHub by including to the
tag/branch name in the url:
<git-url>//<projectname>[:<branchname>]/<source-dir>. This branch
name is optional, and when left out, it automatically refers to master.
Regards,
Diego