Moving to git

Ever since starting my latest client project a few months ago, I’ve started using git. I had the fortune to be trained by a couple git badasses, so it was a pretty smooth transition. At some point, I figured it was time to start porting my own open source projects to git, while keeping the svn repositories current. Here’s a rakefile I worked up to move my own plugins in one command:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# imports all dirs in given SVN dir as a separate git repo in the current directory
# pass SERVER= to specify a remote git server.  it'll add it as a remote for origin and push master:refs/heads/master
task :fetch_plugins do
  raise "need svn repo in SVN env var" if ENV['SVN'].nil?
  ENV['GIT'] ||= 'git'
  repos = %x{svn ls #{ENV['SVN']}}.split
  repos.each do |repo|
    next unless repo =~ /\/$/ && !File.exist?(repo)
    repo.gsub! /\/$/, ''
    FileUtils.mkdir_p repo
    error = false
    Dir.chdir repo do
      begin
        puts "initializing #{repo}..."
        %x{git svn init #{ENV['SVN']}/#{repo}}
        puts %x{git svn fetch}
        if ENV['SERVER']
          puts %x{git remote add origin #{ENV['GIT']}@#{ENV['SERVER']}:#{repo}.git}
          puts %x{git push origin master:refs/heads/master}
          puts %x{git config branch.master.remote 'origin'}
          puts %x{git config branch.master.merge 'refs/heads/master'}
        end
      rescue
        error = $!
      end
    end
    if error
      FileUtils.rm_rf repo
      puts "removing #{repo}: #{error.inspect}"
    end
  end
end

If you read through, it does these basic commands:


mkdir pluginname
cd pluginname
git svn init http://pluginurl
git svn fetch
# get some coffee
git remote add origin git@server:pluginname.git
git config branch.master.remote 'origin'
git config branch.master.merge 'refs/heads/master'
git push origin master:refs/heads/master

The last command pushes the local master branch to a master branch on the remote git server. Once that’s done, you should be able to git push/pull without issues. However, there’s something missing from the .git/config file, and in my git newbieness, I have no idea how else to fix: Update – I know how to fix this now. See the git config commands in the rake task. No more need to modify .git/config manually.

[branch "master"]
        remote = origin
        merge = refs/heads/master

You can setup gitosis on the server to manage the repos. It’s a brilliant piece of software that uses a single ‘git’ user account and public keys to manage access to various repos. The only issue I had with the config file though, was that it required a [repo] entry for every plugin to enable git daemon access. Here’s what I mean:

[group activereload]
writable = gitosis-admin lighthouse warehouse darkroom
members = caged rick

[group mephisto]
writable = mephisto
members = imajes psq svenfuchs caged rick

# enable gitweb 
[repo mephisto]
daemon = yes

You now clone mephisto and the rest of my open source projects with a command like “git clone git://activereload.net/mephisto.git”.

Oh, and merry christmas and all that. I didn’t really intend for this to be “one of those” posts. I’m just having some problems going back to sleep after playing santa (putting out presents, eating the cookies, etc).

Comments

| Probably uses Markdown...