Yesterday Google Code Project Hosting shut down the ability for projects to add new downloads, just as they announced back in May. The reason they say, is because the “downloads have become a source of abuse”. I have no doubt they were having problems, but this move — basically killing Project Hosting instead of fixing it — shows that they really see no future in the product. I had some trouble with this back in March and a rather unpleasant experience trying to get Google to correct it.
It was perhaps no coincidence that Github less than two months later announced “releases”, finally making it possible to ship binaries to end users (they did have a downloads section for a while, which has since been removed). With this launch, Github is offering a lot more than Google has ever offered with Project Hosting.
Last weekend I spent some time to finally migrate my repositories over to Git and Github. All my repositories on Google were using Subversion, the first VCS that they offered (they now also offer Mercurial and Git). It has been clear for a while now that Git has won the DCVS fight, so this feels very familiar to the days when people were moving from CVS to Subversion.
Github suggests that you use svn2git to migrate from Subversion to Git. The only issue I had with this is that it is impossible to use it to migrate your Project Hosting-specific
/wiki directory, and I had a lot of trouble finding a good solution. Finally I stumbled over Google’s instructions on converting your repository from Subversion to Git. What I ended up using is a combination of the two.
Before we move on, I want to mention that you might want to import your
/wiki directory as a Github wiki, but in my opinion Github wikis are kinda sucky, as there is no good way to merge between forks. If you prefer this option, continue reading for a bit, but instead of merging your two Git repositories, just push one of them as your project repo and the other one as your wiki repo.
First, use svn2git to transfer everything except your
/wiki directory. Your
/trunk will become your master branch,
/branches will become their own branches and
/tags will automatically be tagged. Be sure to build your
~/.svn2git/authors file first, and always run svn2git with the verbose flags, since otherwise you might not see important conversion errors. If your branches and tags are not correctly converted, watch out for this bug.
svn2git -v http://altdrag.googlecode.com/svn/
Then, use “
git svn clone” to transfer your
/wiki directory to its own little git repo. Use
--no-metadata to get the commit messages in the same format as svn2git.
git svn clone http://altdrag.googlecode.com/svn/wiki altdrag.wiki --authors-file=$HOME/.svn2git/authors --no-metadata
Now, to combine your two repositories, you will create a “
git subtree” inside the repository that svn2git created. This will magically insert the wiki commits in the repository history, but inside a new /wiki directory.
git subtree add --prefix=wiki file:///home/recover/altdrag.wiki master
If you get an error running this command, you might have to run these commands first (Ubuntu):
sudo chmod +x /usr/share/doc/git/contrib/subtree/git-subtree.sh
sudo ln -s /usr/share/doc/git/contrib/subtree/git-subtree.sh /usr/lib/git-core/git-subtree
Now run “
git log” and verify that everything is Ok.
I also decided to rename my tags from the traditional “
altdrag-0.1” Subversion syntax to semantic versioning, commonly used with Git.
git tag v0.1 altdrag-0.1
git tag v0.2 altdrag-0.2
git tag -d altdrag-0.1 altdrag-0.2 ...
Now you should be all set to push your repository to Github. Create your repo on Github, then add it as a new remote and push everything.
git remote add origin firstname.lastname@example.org:stefansundin/altdrag.git
git push -u origin --all
git push --tags
Now all you have left to do is to move over your binaries to the release tags that were automatically created.
I will still have to go back to Google Project Hosting from time to time during this transition. I still have lots of issue reports on Project Hosting that I intend to resolve there. And when I release the next version, I have to transfer the feature that checks if a new version has been released to Github.
It feels good to finally move over to Github. Google Project Hosting was fun while it lasted, but I hereby pronounce it dead.